UIImageView brakujące obrazy na ekranie uruchamiania na urządzeniu

301

Mam aplikację obsługującą system iOS8 i nowsze, wbudowaną w Xcode 7 i używam XIB do ekranu uruchamiania (nie mam obrazów uruchamiania). Widok zawiera pojedynczy UILabel z wersją aplikacji oraz 2 UIImageViews z obrazami, które oba są obecne w Images.xcassets: Logo i obraz powitalny.

UILabel i obraz logo są wyświetlane poprawnie po uruchomieniu aplikacji, ale obraz powitalny nie pojawia się, jeśli uruchomię aplikację na iPadzie Air 2 z iOS9. Testowałem na symulatorze Air i Mini z systemem iOS8 i iOS9 dla iPada 2, iPada Air i iPada Air 2, a obraz jest poprawnie wyświetlany we wszystkich tych urządzeniach.

Przeprowadziłem podstawowe rozwiązywanie problemów, aby dowiedzieć się, co się dzieje, ale nie byłem w stanie tego rozwiązać, a jedyną różnicą, którą widzę między obrazem, który działa, a tym, który zawodzi, jest to, że dodałem go do majątek...

Oto podsumowanie tego, co wiem:

  • UIImageView dla obrazu powitalnego znajduje się we właściwym miejscu, we właściwym rozmiarze. Mogę to powiedzieć, ponieważ dla pewności ustawiłem kolor tła na zielony. Widok jest tam, ale obraz się nie pojawia. Zakładam więc, że nie można winić tego widoku.

  • Ustawienie UIImageView dla obrazu powitalnego tak, aby używał również obrazu logo, powoduje, że obraz logo pojawia się we właściwym miejscu dla widoku. To prowadzi mnie również do założenia, że ​​nie można winić tego widoku.

  • UIImage, którego używam w widoku powitalnym, jest używany gdzie indziej w aplikacji i pojawia się dobrze w tych innych widokach (obraz logo jest również używany w innym miejscu w aplikacji i wygląda dobrze). Zakładam więc, że obraz jest prawidłowy, a wyświetlenie go w innych widokach nie stanowi problemu.

  • Potwierdziłem, że ustawienia UIImages dla logo i splash w pliku xcassets są takie same. Są ustawione na Uniwersalny, Dowolna szerokość i wysokość, wiele współczynników skali, renderowanych jako domyślne. Jest jedna różnica - logo ma skale 1x, 2x i 3x, podczas gdy obraz powitalny ma tylko 1x i 2x, ale próbowałem również użyć UIImagów tylko z wartościami 1x, 1x i 2x w UIView i działają (jeśli były dodane do projektu jakiś czas temu).

  • Dodanie innego obrazu o innym rozmiarze lub formacie (PNG i JPG) do moich zestawów xcasset i użycie tego UIImage w UIImageView dla obrazu powitalnego również nie wyświetla się.

  • Dodanie kolejnego UIImageView do pliku XIB i przydzielenie mu UIImage, który był już w xcasset działa, obraz pojawi się na ekranie ładowania.

  • Kopiowanie i zmiana nazw plików graficznych używanych do logo oraz dodawanie ich do projektu, a następnie używanie tego UIImage w widoku powitalnym również nie jest wyświetlane.

  • Próbowałem wyczyścić projekt, ponownie uruchomić maszynę programistyczną, usunąć aplikację z Air 2 i ponownie zainstalować ją na wypadek, gdyby był problem.

Te trzy ostatnie kroki doprowadziły mnie do wniosku, że istnieje pewien problem z obrazami dodanymi po pewnym momencie życia pliku projektu. Podczas gdy wczoraj zaktualizowałem Xcode 7, obraz powitalny został pierwotnie dodany w Xcode 6, ale obraz logo (również dodany w Xcode 6) został dodany kilka miesięcy wcześniej.

Przejrzałem pliki json pod kątem obrazu logo i obrazu powitalnego i wydają się mieć ten sam format. Przeszukałem również plik pbxproj w poszukiwaniu różnic i nie widzę żadnych.

Zastanawiałem się więc, czy ktoś nie miał pojęcia, dlaczego ekran uruchamiania może nie wyświetlać tych nowych obrazów, które konkretnie dodaję na Air 2? Inne pytania, które czytałem, odnoszące się do obrazów, które nie pojawiają się wszystkie, wydają się dotyczyć albo obrazów uruchamiania, albo obrazów w plikach XIB, które mają powiązane klasy, z których żadne nie wydaje się tutaj istotne.

MFW
źródło
1
Chciałem na to odpowiedzieć - wróciłem i przeczytałem podane odpowiedzi, po czym wróciłem do Xcode i ponownie dodałem UIImageView i obrazek, aby je wypróbować. Tym razem działało bez żadnych zmian. Nie mam pojęcia, dlaczego - ta sama wersja Xcode, zrestartowałem, przebudowałem, wyczyściłem i usunąłem wcześniej aplikację, ten sam iOS, ten sam Mac OS, po prostu działało. Niestety nie byłem w stanie zweryfikować, czy którekolwiek z rozwiązań pomogłoby.
MFW,
Dla mnie ŻADNA z podanych odpowiedzi nie rozwiązała problemu. Symulator, iPhone 5, iPhone 5 SE, iPad 4 poprawnie wyświetlają UIImageView w moim LaunchScreen.xib, iPad Air 2 go nie wyświetli. Zrestartowano wszystkie urządzenia, ponownie zainstalowane na wszystkich urządzeniach. Zachowanie pozostaje.
Christian
Hej, powinieneś zaakceptować 130+ głosowanych odpowiedzi.
Khanh Nguyen,
Zgadzam się z Khanh, to działa na większość !!
gunjot singh
@MFW, AKCEPTUJ ODPOWIEDŹ FFS! ZGŁASZAM U DO KOSZTÓW.
GeneCode

Odpowiedzi:

474

Wyłącz, a następnie włącz ponownie.

Poważnie, uruchom ponownie urządzenie - to właśnie dla mnie to naprawiło.

Oto, co nie działało:

  • Czyszczenie danych pochodnych
  • Czyszczenie projektu
  • Odinstalowywanie aplikacji z urządzenia
  • Ponowne uruchamianie Xcode
  • Ponowne uruchomienie komputera

Starsze obserwacje:

Podobnie jak inne, to:

  • Działa dobrze w symulatorze
  • Służy do pracy na urządzeniach (iPhone 5S, iPad Air)
  • Brak zmian w kodzie (zweryfikowany przez git reset - twardy HEAD), ale przestał działać.

Pamiętam, że uruchomienie pierwszej wersji, w której przestał działać, to odłączenie iPhone'a podczas jego uruchamiania. (Nie jestem pewien, czy jest to powiązane).

Jednak reset git nie naprawiający go (w połączeniu ze wszystkimi niedziałającymi czystymi krokami) mówi mi, że to musi być zbuforowane gdzie indziej. Całkiem możliwe, że w jednym z plików .gitignored? (Używam pliku ignorowania Git dla projektów Xcode )

Jednym obejściem, które działało dla jednego UIImageView (w UIView, który ma trzy), ale nie dla innych, było umieszczenie obrazu w pliku .xcassets. Przywrócenie zwykłego pliku obrazu nie cofnęło poprawki. (Naprawdę czuję się jak błąd buforowania).

AKTUALIZACJA: Patrz u góry - ponowne uruchomienie urządzenia naprawiło to. Mam wrażenie, że niewłaściwe dane bitmapowe są buforowane na samym urządzeniu.

Radar: http://openradar.appspot.com/23534818

Aral Balkan
źródło
31
Po prostu ponownie uruchomiłem symulator. Zwariowany!
FractalDoctor,
1
Dziękuję Ci! To również mnie naprawiło.
CodenameDuchess
6
Czy uważasz, że użytkownicy App Store będą mieli ten sam problem?
Adam Waite,
1
@danielstorm nigdy nie okazał się szczery
Adam Waite
2
Co za opóźniony błąd, gg jabłko. Ponowne uruchomienie mojego telefonu działało dla mnie, dzięki.
Jakub Król
151

„Rozwiązaniem dla mnie było po prostu upewnienie się, że pole„ Czyści kontekst graficzny ”nie jest zaznaczone dla UIImageView w serii ujęć. Po prostu to zmieniłem, naprawiłem to.” Żadne inne rozwiązania nie działały dla mnie. Dostałem to z forum programistów Apple

wprowadź opis zdjęcia tutaj

NikLanf
źródło
2
Cholera, nigdy bym nie pomyślał, żeby tego spróbować. Naprawiono symulator i urządzenie z Xcode 7.3.1 (7D1014) i iOS 9.3.2 Developer Beta 3.
Kowalik
3
Mogę potwierdzić, że to również działało dla mnie. Xcode 7.3 i iOS 9.3.2.
Torbjørn Kristoffersen
1
Nawet z moim już zaznaczonym - odznaczenie i ponowne sprawdzenie załatwiło sprawę!
lonesomewhistle
1
Ładne +1 za odpowiedź, działa również w Xcode 8 i iOS 10
Skovie
1
To jest poprawna odpowiedź. Sprawdzony na iOS 11, na urządzeniu.
jberlana
99

Miałem dokładnie ten sam problem na iPhonie 6.

Bardzo dziwny jest fakt, że mogłem użyć innego obrazu z moich obrazów. Xcassets, które miały ten sam rozmiar, kompresję, przestrzeń kolorów ...

Nie jestem w stanie dowiedzieć się, dlaczego to nie działa, ale znalazłem rozwiązanie: po prostu umieść plik poza plikami images.xcassets i użyj jego pełnej nazwy (z rozszerzeniem) w Konstruktorze interfejsów

splashScreen w próbce scenorysu

Mam nadzieję, że to pomoże !

gbitaudeau
źródło
1
To była pierwsza rzecz, której spróbowałem, ale to nie działa dla mnie.
Paul Slocum,
To zadziałało dla mnie; dzięki. Chciałbym wiedzieć, dlaczego to działa tylko w przypadku niektórych obrazów w plikach xcassets ...
Christopher King,
Na początku działa to dla mnie, ale teraz właściwości obrazu lub etykiety nie są w ogóle aktualizowane. Nawet po czystym działaniu produktu. Złożył błąd tutaj: bugreport.apple.com
Philip Borges
Ponowne uruchomienie iPhone'a 6s po usunięciu aplikacji wykonało zadanie. Wcześniej sprawdzono także rozwiązanie NikLanf poniżej „czyści kontekst graficzny”.
Matthew Ferguson
To działa. Wydaje mi się, że powodem tego jest to, że .xcasset nie jest jeszcze załadowany, gdy wyświetlany jest ekran startowy. Jeśli się nad tym zastanowić, to właśnie do tego służy ekran startowy - czas oczekiwania na załadowanie przez aplikację zawartości aplikacji, w tym xcasset. Domyślam się, że umieszczenie go na zewnątrz działa, ponieważ wszystko w folderze głównym aplikacji zostanie załadowane jako pierwsze.
GeneCode
33

Poniższa sekwencja operacji naprawiła dla mnie problem na Xcode 7.3.1 i iOS 9.3.4:

  1. Wyczyść swoją kompilację (⌘ + ⇧ + K)
  2. Zamknij Xcode
  3. Twarde resetowanie urządzenia iOS (ponowne uruchomienie przycisku zasilania + przycisku głównego)
  4. Uruchom ponownie Xcode - pozwól indeksowaniu zakończyć i zbudować na urządzeniu, gdy będzie gotowe.
mayankk2308
źródło
Uratowałem mój dzień! Dzięki!
Zack Zhu
Pracował Nie wykonałem kroków 2 i 4, być może potrzebny jest tylko twardy reset urządzenia z systemem iOS, czy ktoś może to potwierdzić?
Timothy LJ Stewart
@ TimothyL.J.Stewart Kroki 2 i 4 były po prostu bardziej ostrożnymi krokami, które podjąłem, ponieważ problem był dla mnie dość irytujący - więc na wszelki wypadek. Myślę, że masz rację mówiąc, że mogą być niepotrzebne, ponieważ tak naprawdę (zwykle) nie wpływają na kompilację.
mayankk2308
Xcode 8 Swift 3.0 Wyłączanie lub twardy reset jest jedyną rzeczą, która działa za każdym razem i musi być wykonana za każdym razem, gdy dodawany jest nowy zasób. Usuwanie DerivedData nie powoduje. Jednak obraz działa poprawnie w symulatorze. To zmarnowało tyle mojego czasu, dziękuję @MayankKumar za rozwiązanie.
Timothy LJ Stewart
Działa
27

Wiele innych odpowiedzi sugeruje ponowne uruchomienie urządzeń i / lub przebudowanie i / lub ponowna instalacja jest rozwiązaniem.

Chociaż te odpowiedzi działają w przypadku niektórych z nas, przyczyną jest to, że aplikacja jest zmuszona do „wznowienia” lub „odbudowania” migawek w pamięci podręcznej.

Migawki w pamięci podręcznej są używane przez aplikacje do prezentacji obrazów przed załadowaniem danych obsługujących do pamięci, w tym katalogu zasobów zawierającego obrazy scenariuszy.

Ta SO odpowiedź @jaga stanowi rozwiązanie, ale nie powód, dla którego brakuje UIImageViews na ekranie uruchamiania na urządzeniu (ale nie w symulatorze).

tło

Ostatnio próbowałem użyć niestandardowej czcionki w moim pliku „Launch Screen.storyboard”.

Powód, dla którego nie mogłem się wyjaśnić po przeczytaniu tej odpowiedzi SO przez @TimCamber, która skłoniła mnie do przeprowadzenia dalszych badań i testów.

Powodem, dla którego niestandardowa czcionka nie jest uwzględniona w moim pliku Storyboard ekranu uruchamiania, jest ten sam powód, dla którego obraz w katalogu zasobów nie został uwzględniony ...

Aplikacja przygotowuje migawki pionowe i krajobrazowe ekranu uruchamiania aplikacji z pliku scenariusza ekranu uruchamiania i (obecnie) zapisuje go w pakiecie aplikacji tutaj:

  • /Library/Caches/Snapshots/<<app_bundle>>/ i
  • /Library/Caches/Snapshots/<<app_bundle>>/downscaled/.

Ten proces jest zakończony przed załadowaniem jakichkolwiek plików pomocniczych, w tym niestandardowych czcionek i katalogu zasobów.

Rozwiązanie

Jak wspomniano powyżej, postępując zgodnie z rozwiązaniem @ jaga, dosłownie wszystko, czego potrzeba, to:

  1. (stara szkoła) dodaj plik obrazu (.PNG) do pakietu aplikacji (jak widać na zrzucie ekranu poniżej, dodałem plik obrazu w podkatalogu Obsługiwane pliki w podkatalogu Obrazy) i

zrzut ekranu odpowiednich katalogów w Project Navigator w Xcode

  1. odwołać się do tego obrazu w obiekcie UIImageView w pliku Storyboard ekranu uruchamiania ...

zrzut ekranu sekcji Widok obrazu dla UIImageView w obszarze Inspektor atrybutów w Xcode

andrewbuilder
źródło
Dziękuję, walczyłem z tym przez chwilę. To działa dla mnie.
James Laurenstin,
pracował dla mnie bezpośrednio. to powinna być poprawna odpowiedź
Mohammad Shraim
Podczas uruchamiania IOS nie był w stanie skompilować zasobów, więc umieszczenie obrazu w pakiecie działa. Dzięki.
może
Najlepsza jak dotąd odpowiedź. Dodam to: obraz musi znajdować się w katalogu głównym pakietu aplikacji. W przeciwnym razie musisz podać pełną ścieżkę „Media / launch_v1_200_mod.png”, jeśli przechowujesz obrazy w podkatalogu.
MoVod
1
Zrobiłem to samo. Moja aplikacja jest już uruchomiona, ale problem polega na tym, że czasami wyświetla obraz, a czasem pokazuje kwadrat z białym kolorem na środku ekranu
Punit
21

Widziałem ten sam problem. Ponowne uruchomienie urządzenia (iPhone 6) i przebudowanie aplikacji na urządzenie jest jedyną rzeczą, która go naprawiła. Próbowałem wielu innych wskazówek i sugestii, ale nic więcej nie działało. Pomogło tylko ponowne uruchomienie + przebudowa.

Bruce L.
źródło
Jak to będzie wyglądać, jeśli użytkownik zaktualizuje aplikację z AppStore? Czy będzie musiał ponownie uruchomić urządzenie?
kokos8998
17

Moje rozwiązanie @ iOS 11.x:

  • Użyj .jpgobrazu zamiast .png. Myślę, że rozmiar pliku obrazu ma znaczenie;
  • (Opcjonalnie) Umieść plik obrazu w katalogu projektu zamiast .xcassets;
Ke Yang
źródło
3
Umieszczenie poza plik obrazu .xcassetspomógł
Husam
@Husam Naprawdę uważam, że rozmiar pliku ma znaczenie. Mam ekran startowy z dwoma obrazami: dużym (400 + KB .png) i logo (10 + KB .png, wewnątrz .xcassets). Logo zawsze wyświetla się normalnie, ale duże nie.
Ke Yang
Masz rację .. Po moim komentarzu problem pojawił się ponownie po dodaniu kolejnego obrazu. Dzięki za pomoc
Husam,
2
Następnie postępuj zgodnie z instrukcjami, używając obrazu jpg i pracował
Husam
16

Miałem to samo dla aplikacji zainstalowanej z TestFlight. Usuń aplikację -> następnie ponownie uruchom iPhone'a -> następnie zainstaluj ponownie aplikację działa dla mnie. Ponowna instalacja aplikacji lub ponowne uruchomienie urządzenia nie pomogło.

Petro Shm
źródło
To jedyna rzecz, która działała dla mnie - szkoda, że ​​nie widziałem tego 90 minut temu!
KML
żałuję, że nie widziałem tego 4 godziny temu
gerry.liang
Pracowałem również dla mnie, ale problem jest dziwny: |
Nishu_Priya
8

Miałem ten sam problem, ale ponowne uruchomienie urządzenia nie pomogło. To, co zadziałało, to usunięcie UIImageView z mojej scenorysu uruchamiania i dodanie nowego.

Jim Rhoades
źródło
8

Czy próbowałeś wyłączyć urządzenie i włączyć je ponownie? Zrób to.

Jakub Truhlář
źródło
7

Dla mnie zadziałało wybranie Resetuj zawartość i ustawienia ... z menu Symulatora

Zresetuj menu zawartości i ustawień

andnil
źródło
6

Wyjmij obrazy z Image.xcassets i dodaj je ponownie do projektu. To zadziałało dla mnie.

Trinh Tran
źródło
Działa to tylko dlatego, że zmuszasz aplikację do odtworzenia migawek ekranu uruchamiania, ale nie jest to rozwiązanie ani przyczyna problemu.
andrewbuilder
6

Usuń aplikację z urządzenia mobilnego, a następnie uruchom ponownie urządzenie mobilne i zainstaluj aplikację ponownie. teraz problemy zostaną rozwiązane

midhun p
źródło
5

Używam urządzenia iPhone 5s, również spotykam ten problem.

Naprawiam to przez:

  • Usuń dane z dysku

  • Oczyść projekt

  • Uruchom ponownie Xcode

  • Usuń projekt z mojego urządzenia

  • Uruchom ponownie 5s.

Wydaje mi się, że używanie pamięci Xcode jest czymś złym, system może przydzielić trochę pamięci dla Xcode, ponieważ Xcode nie udało się narysować obrazu lunchu (na moim komputerze Xcode działał przez kilka tygodni bez zamknięcia)

guozqzzu
źródło
Nie wiem, ale zadziałało ... jak dobrze. Dzięki człowieku za udostępnienie.
Arpit B Parekh
4

Miałem też dokładnie ten problem w Xcode 7 z urządzeniami iPad i iPhone. Chociaż nie ma to sensu, przez większość czasu mogłem obejść ten problem, ustawiając nie tylko Obraz, ale także Podświetlony obraz w widoku obrazu na ten sam obraz w moich obrazach. Xcassets.

Bonnie Lapin
źródło
Wydaje się, że mi również
pomogła
4

Myślę, że ekran startowy obsługuje tylko obraz w Assets.xcassets.

Słonecznie
źródło
Próbowałem wszystkich powyższych odpowiedzi i żadna z nich nie działała dla mnie. Ale ta odpowiedź rozwiązała problem.
Ercan Celik
4

zadziałało dla mnie.

Pierwszy w Xcode Clean de Project.

Jeśli korzystasz z symulatora, usuń aplikację i uruchom ponownie.

Jeśli korzystasz z urządzenia, usuń aplikację i uruchom ponownie urządzenie.

oscar castellon
źródło
3

Ponowne uruchomienie Xcode zrobiło to dla mnie.

Czego nie robić:

  • Wyczyść folder kompilacji
  • Uruchom ponownie urządzenie lub symulator (obraz nie był widoczny na żadnym z nich)
Manuel
źródło
3

Wybierz ImageView, a następnie usuń rozszerzenie obrazu (.png lub .jpg) na karcie inspektora atrybutów> Widok obrazu> Obraz> Nazwa obrazu.

Na launchscreen.storyboard obraz nie pojawi się, ale będzie tam w urządzeniu. To zadziałało dla mnie.

Asha Antony
źródło
To też był mój problem. O dziwo, losowo działało na niektórych urządzeniach. Xamarin-Project z Xcode 9.4 do edycji XIB / Storyboard ...
fl034
2

To wydawało się błędem iOS. Jak czasem zniknęła animacja systemu.

Teraz ponownie uruchamiam iPhone'a i działa on dla mnie.

Amon Xu
źródło
2

W moim przypadku była to nazwa obrazu .
Dodałem obraz o nazwie [email protected]LaunchScreen.xib - jeden z moich starych ekranów uruchamiania tylko do celów testowych. Budowałem na iPhonie X Simulator, obraz się nie pojawił.

Zmiana nazwy na neutralną (MyImage.png) rozwiązała problem.

Wygląda na to, że @2xbyła to część problemu, jak również -568h. Co ma sens na -812h@3xurządzeniu.

de.
źródło
2

To zbyt ważne. Musi być pusty !Launch Screen File

wprowadź opis zdjęcia tutaj

SwiftDeveloper
źródło
8
Używa scenariusza XIB do uruchomienia, ta odpowiedź nie zadziała.
benck 30.09.17
2

Prostym rozwiązaniem jest użycie JPG zamiast PNG.

KRÓL
źródło
1

Mam ten sam problem z obrazem Storyboard na ekranie uruchamiania. Usunąłem odniesienie do obrazu z projektu, zmieniłem nazwę obrazu i dodałem go ponownie do projektu. Wszystko działa idealnie.

ostap_holub
źródło
1

Można również 1. usunąć obraz projektu 2. zmienić nazwę obrazu 3. dodać obraz pliku do projektu

To zadziałało dla mnie.

Jesse
źródło
1

Miałem ten problem w iOS 10 na iPhonie 6, a także w Symulatorze. Mój obraz był w folderze i wydawało się, że to jest problem. Usunąłem obraz z folderu w Xcode i umieściłem go w katalogu podstawowym projektu, który rozwiązał problem.

JamieDass
źródło
1

Doświadczam tego samego. Zmieniam rozdzielczość obrazu z 300 pikseli / cal, zmieniam na 72. To działa dla mnie.

Tim Le
źródło
1

Następnie pomógł mi:

  • zmień „Launch Screen File” na inny xib
  • uruchom aplikację
  • zmienić xib z powrotem

Również bardzo ważne : sprawdź, czy xib nie jest otwarty w innej karcie, może to również powodować!

Vladimir Tolstikov
źródło
1

Znalazłem proste, ale radykalne rozwiązanie, które działało dla mnie:

1 - Usuń plik: LaunchScreen.storyboard i przenieś go do kosza.

2 - Produkt -> Czysty

3 - Utwórz nowy plik ekranu uruchamiania o nazwie: LaunchScreen.storyboard i umieść w nim swoje obrazy

4 - Zapisz i buduj

To działało dla mnie po wielu godzinach próbowania skomplikowanych metod ... Wygląda na to, że mój LaunchScreen.storyboard został zablokowany i nie można go zapisać lub blokuje go dziwny proces buforowania.

Fox5150
źródło
1

Nazwa obrazu jest problemem. Zmień nazwę nazwy obrazu używanej w serii ujęć ekranu uruchamiania. Upewnij się, że nie używasz żadnych znaków innych niż alfanumeryczne (nie używaj „_- & @”). Działa dla mnie jak urok.

Aproram
źródło