Zamieszanie rozdzielczości iPhone'a 6 Plus: Xcode lub strona internetowa Apple? dla rozwoju

265

Witryna Apple twierdzi, że rozdzielczość wynosi 1080p: 1920 x 1080

Jednak ekran uruchamiania wymagany przez Xcode (8.0 GM wprowadzony dzisiaj) to 2208 x 1242.

Kto ma rację

Xcode

JasonGenX
źródło
Obrazy uruchamiania dla iPhone'a 6+ muszą mieć wymiary 1242 x 2208 i 2208 x 1242. Przynajmniej sprawia to, że aplikacje działają poprawnie w symulatorze (i jest to udokumentowane w HIG). Nie zorientowałem się, dlaczego różni się to od domniemanego fizycznego rozmiaru ekranu 1920x1080.
rmaddy
2
bardzo dziwna rozbieżność.
JasonGenX
14
Doskonałe wyjaśnienie: paintcodeapp.com/news/iphone-6-screens-demystified
Andreas Ley
Może się to zmienić w stabilnej wersji Xcode 6.1. Czy to jest
Jayprakash Dubey
3
Aby zaktualizować link Andreasa, zobacz „Ultimate Guide to iPhone Resolutions” paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
David James

Odpowiedzi:

308

IPhone 6+ renderuje wewnętrznie przy użyciu zasobów @ 3x w wirtualnej rozdzielczości 2208 × 1242 (z 736x414 punktami), a następnie próbkuje to do wyświetlenia. To samo, co przy użyciu skalowanej rozdzielczości na MacBooku Retina - pozwala na trafienie całkowitej wielokrotności zasobów pikselowych, przy jednoczesnym zachowaniu np. Tekstu 12 pt na ekranie tego samego rozmiaru.

Tak, ekrany uruchamiania muszą mieć taki rozmiar.

Matematyka:

Wszystkie 6, 5, 5, 4 i 4 mają 326 pikseli na cal i używają zasobów @ 2x, aby trzymać się około 160 punktów na cal wszystkich poprzednich urządzeń.

6+ to 401 pikseli na cal. Dlatego hipotetycznie potrzebuje około 2,46x zasobów. Zamiast tego Apple używa zasobów @ 3x i skaluje całą produkcję do około 84% jej naturalnego rozmiaru.

W praktyce Apple zdecydowało się na więcej niż 87%, zmieniając 1080 na 1242. Bez wątpienia było to znaleźć coś tak zbliżonego do 84%, które wciąż produkowało integralne rozmiary w obu kierunkach - dokładnie 1242/1080 = 2208/1920 , natomiast jeśli zmieniłeś 1080 na, powiedzmy, 1286, musiałbyś w jakiś sposób renderować 2286.22 pikseli w pionie, aby dobrze skalować.

Tommy
źródło
6
Jak to obliczyłeś-> „wirtualna rozdzielczość 2208 × 1242 (z 736x414 punktami)” i to „potrzebuje mniej więcej @ 2,46x zasobów”. Co będzie UIScreen mainScreen] .bounds.size.height. Zwróci dla 6+? 568, 568 * 3 (1704) lub 1920.
msk
1
Być może dodaj notatkę do tej odpowiedzi na temat obrazów uruchamiania? (patrz odpowiedź Hannesa) Warto pamiętać, że istniejące aplikacje są uaktualniane (w przeciwnym razie działa w rozdzielczości 320x576 @ 3x - byłem przez chwilę zdezorientowany!)
Joseph Humfrey
2
@msk [UIScreen mainScreen].bounds.size.heightzwraca 736 w symulatorze iPhone'a 6+ w trybie portretowym. Jest to wartość 2208 podzielona przez skalę 3. Szerokość wynosi 414.
rmaddy
1
Nie jest dokładnie tego samego rozmiaru przy @ 3x z rozdzielczością 1242 * 2208, ma 6% rozciągnięcia.
Binarian
4
Co za okropna kludge! Ogólnosystemowa utrata wydajności, pamięci i ostrości tylko po to, aby niektóre modyfikacje wielkości API były nieco prostsze! Cóż, myślę, że to wszystko będzie miało sens, gdy wypuszczą iPhone'a 7 Plus z wyświetlaczem 5,5 "461 ppi.
Sup
114

Odpowiedź jest taka, że ​​starsze aplikacje działają w trybie powiększenia 2208 x 1242. Ale gdy aplikacja jest budowana dla nowych telefonów, dostępne są rozdzielczości: Super Retina HD 5.8 (iPhone X) 1125 x 2436 (458ppi) , Retina HD 5.5 ( iPhone 6, 7, 8 Plus ) 1242 x 2208 i Retina HD 4.7 ( iPhone 6 ) 750 x 1334 . To powoduje zamieszanie wspomniane w pytaniu. Aby budować aplikacje wykorzystujące pełny ekran nowych telefonów, dodaj LaunchImages w rozmiarach: 1125 x 2436, 1242 x 2208, 2208 x 1242 i 750 x 1334.

Zaktualizowano dla nowych iPhone'ów 11, 11 Pro, 11 Pro Max

Rozmiar dla iPhone'a 11 Pro Max ze skalowaniem @ 3x , przestrzeń współrzędnych: 414 x 896 punktów i 1242 x 2688 pikseli, 458 ppi, fizyczny rozmiar urządzenia to 3,06 x 6,22 cala lub 77,8 x 158,0 mm. 6,5-calowy wyświetlacz Super Retina XDR.

Rozmiar dla iPhone'a 11 Pro ze skalowaniem @ 3x , przestrzeń współrzędnych: 375 x 812 punktów i 1125 x 2436 pikseli, 458 ppi, fizyczny rozmiar urządzenia to 2,81 x 5,67 cala lub 71,4 x 144,0 mm. Wyświetlacz Super Retina XDR 5,8 ".

Rozmiar dla iPhone'a 11 ze skalowaniem @ 2x , odstęp współrzędnych: 414 x 896 punktów i 828 x 1792 pikseli, 326 ppi, fizyczny rozmiar urządzenia to 2,98 x 5,94 cala lub 75,7 x 150,9 mm. Wyświetlacz 6.1 "Liquid Retina HD.

Rozmiar dla iPhone'a X🅂 Max ze skalowaniem @ 3x (nazwa Apple: wyświetlacz Super Retina HD 6.5 " ), przestrzeń współrzędnych: 414 x 896 punktów i 1242 x 2688 pikseli, 458 ppi, fizyczny rozmiar urządzenia to 3,05 x 6,20 cala lub 77,4 x 157,5 mm

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 Max Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 1242.0, 2688.0), scale: 3.0

Rozmiar dla iPhone'a X🅁 ze skalowaniem @ 2x (nazwa Apple: wyświetlacz Super Retina HD 6.1 " ), przestrzeń współrzędnych: 414 x 896 punktów i 828 x 1792 pikseli, 326 ppi, fizyczny rozmiar urządzenia to 2,98 x 5,94 cala lub 75,7 x 150,9 mm .

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅁 Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 828.0, 1792.0), scale: 2.0

Rozmiar dla iPhone'a X🅂 i iPhone'a X ze skalowaniem @ 3x (nazwa Apple: wyświetlacz Super Retina HD 5.8 " ), przestrzeń współrzędnych: 375 x 812 punktów i 1125 x 2436 pikseli, 458 ppi, fizyczny rozmiar urządzenia to 2,79 x 5,65 cala lub 70,9 x 143,6 mm.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 and X Screen bounds: (0.0, 0.0, 375.0, 812.0), Screen resolution: (0.0, 0.0, 1125.0, 2436.0), scale: 3.0

wprowadź opis zdjęcia tutaj

Rozmiar dla iPhone'a 6, 6S, 7 i 8 ze skalowaniem @ 3x (nazwa Apple: Retina HD 5.5 ), przestrzeń współrzędnych: 414 x 736 punktów i 1242 x 2208 pikseli, 401 ppi, fizyczny rozmiar ekranu wynosi 2,7 x 4,8 cala lub 68 x 122 mm . Podczas pracy w trybie powiększenia, tj. Bez nowych obrazów uruchamiania lub wybranych w Instalatorze na iPhonie 6 Plus, natywna skala wynosi 2,88, a ekran ma 320 x 568 punktów, co jest rodzimym rozmiarem iPhone'a 5:

Screen bounds: {{0, 0}, {414, 736}}, Screen resolution: <UIScreen: 0x7f97fad330b0; bounds = {{0, 0}, {414, 736}};
mode = <UIScreenMode: 0x7f97fae1ce00; size = 1242.000000 x 2208.000000>>, scale: 3.000000, nativeScale: 3.000000

Rozmiar dla iPhone'a 6 i iPhone'a 6S ze skalowaniem @ 2x (nazwa Apple: Retina HD 4.7 ), przestrzeń współrzędnych: 375 x 667 punktów i 750 x 1334 pikseli, 326 ppi, fizyczny rozmiar ekranu to 2,3 x 4,1 cala lub 58 x 104 mm . Podczas pracy w trybie powiększenia, tj. Bez nowej funkcji uruchamiania, ekran ma 320 x 568 punktów, co jest rodzimym rozmiarem iPhone'a 5:

Screen bounds: {{0, 0}, {375, 667}}, Screen resolution: <UIScreen: 0x7fa01b5182d0; bounds = {{0, 0}, {375, 667}};
mode = <UIScreenMode: 0x7fa01b711760; size = 750.000000 x 1334.000000>>, scale: 2.000000, nativeScale: 2.000000

I iPhone 5 porównawcze 640 x 1136, iPhone 4 640 x 960.


Oto kod, którego użyłem do sprawdzenia tego (pamiętaj, że nativeScale działa tylko na iOS 8):

UIScreen *mainScreen = [UIScreen mainScreen];
NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f",
          NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale);

Uwaga: Prześlij LaunchImages, w przeciwnym razie aplikacja będzie działać w trybie powiększenia i nie będzie wyświetlać prawidłowego skalowania ani rozmiarów ekranu. W trybie powiększenia znaki nativeScalei scalenie będą takie same. Na rzeczywistym urządzeniu skala może wynosić 2,608 na iPhonie 6 Plus, nawet jeśli nie działa w trybie powiększenia, ale pokaże skalę 3,0 podczas działania na symulatorze.

Porównywanie iPhone'a 6 i 6 Plus

Sverrisson
źródło
3
Chyba nie dodałeś nowych wersji obrazu uruchamiania. Prawdopodobnie dlatego aplikacja działa w „trybie zgodności”, a granice ekranu to stary 320 x 576 na obu urządzeniach.
Daniel Rinser,
3
Jak tylko dodasz nowe rozmiary obrazu startowego, otrzymasz prawidłowe (logiczne) rozmiary ekranu: 375 x 667 dla iPhone'a 6 i 414x736 dla 6+.
Daniel Rinser,
1
@DanielRinser Dzięki za to. Spróbuję tego.
Sverrisson
@DanielRinser dzięki za wkład w obrazy startowe. Zaktualizowałem odpowiedź na podstawie twoich danych wejściowych.
Sverrisson
a co z zasobami dla iPhone'a 4? Jak je nazwać i jak umieścić je w katalogu aktywów, jeśli nie ma dla nich miejsca? Katalog zasobów zawiera 3 miejsca na zdjęcia iPhone'a: ​​1x, 2x i 3x. Jeśli 2x i 3x dotyczą zasobów iPhone'a 6 i 6+, czy umieszczamy zasoby iPhone'a 4 na 1x? Nie wydaje mi się
Kaczka
96

Rzeczywista / fizyczna rozdzielczość iPhone'a 6 Plus to 1920x1080, ale w Xcode tworzysz interfejs dla rozdzielczości 2208x1242 (736x414 punktów), a na urządzeniu jest on automatycznie skalowany do 1920x1080 pikseli.

Skrócone omówienie rozdzielczości iPhone'a:

Device          Points    Pixels     Scale  Physical Pixels   PPI   Ratio   Size
iPhone XS Max   896x414   2688x1242  3x     2688x1242         458   19.5:9  6.5"
iPhone XR       896x414   1792x828   2x     1792x828          326   19.5:9  6.1"
iPhone X        812x375   2436x1125  3x     2436x1125         458   19.5:9  5.8"
iPhone 6 Plus   736x414   2208x1242  3x     1920x1080         401   16:9    5.5"
iPhone 6        667x375   1334x750   2x     1334x750          326   16:9    4.7"
iPhone 5        568x320   1136x640   2x     1136x640          326   16:9    4.0"
iPhone 4        480x320   960x640    2x     960x640           326   3:2     3.5"
iPhone 3GS      480x320   480x320    1x     480x320           163   3:2     3.5"

Rozdzielczość iPhone'a

Leszek Szary
źródło
3
Piękna i prosta odpowiedź. Dzięki Leszek.
SJ Lim,
46

Prawdopodobnie powinieneś przestać używać obrazów uruchamiania w iOS 8 i używać scenorysu lub stalówki / Xib.

  • W Xcode 6 otwórz Filemenu i wybierz NewFile...iOSUser InterfaceLaunch Screen.

  • Następnie otwórz ustawienia swojego projektu, klikając go.

  • W Generalzakładce w sekcji o nazwie App Icons and Launch Images, należy ustawić Launch Screen Filedla właśnie utworzonych plików (będzie ustawiona UILaunchStoryboardNamew info.plist).

Zauważ, że na razie symulator pokazuje tylko czarny ekran, więc musisz przetestować na prawdziwym urządzeniu .

Dodawanie pliku xib ekranu uruchamiania do projektu:

Dodanie nowego pliku Xib na ekranie uruchamiania

Konfigurowanie projektu do używania pliku xib ekranu uruchamiania zamiast katalogu zasobów:

Skonfiguruj projekt, aby korzystał z Launch Screen xob

Davididk
źródło
1
Prawie doskonałe instrukcje, ale powinien to być Plik -> NOWY -> Plik ... itd. Znalezienie drugiego pliku zajęło trochę czasu :) Dzięki za pomoc!
Czy
Jak sprawić, by wyglądały dobrze? Kiedy próbuję umieścić na nim obraz, robi się bardzo niepewny.
badweasel
Jeśli nie wyświetlasz tylko obrazu i chcesz pokazać interfejs użytkownika do załadowania, jest to dobry pomysł, ponieważ obraz nadal musiałby mieć odpowiednie rozmiary, niezależnie od tego, czy był w scenorysie, czy nie. Podobnie, jeśli możesz narysować obraz w kodzie, to możesz obejść to, jak sądzę.
AppHandwerker
Nadal musisz dostarczyć pliki graficzne, jeśli obsługujesz coś wcześniejszego niż iOS 8, ponieważ xiby uruchamiania nie są kompatybilne wstecz.
Mark Bridges
24

Na urządzeniu fizycznym granice ekranu głównego iPhone'a 6 Plus to 2208 x 1242, a natywna granica to 1920 x 1080 . W celu zmiany rozmiaru wyświetlacza fizycznego konieczne jest skalowanie sprzętowe.

W symulatorze granice ekranu głównego iPhone'a 6 Plus i natywna krawędź to 2208 x 1242.

Innymi słowy ... Wideo, OpenGL i inne rzeczy oparte na CALayerstym rozwiązaniu z pikselami zajmą się prawdziwym buforem ramki 1920 x 1080 na urządzeniu (lub 2208 x 1242 na karcie SIM). Rzeczy dotyczące punktów UIKitbędą dotyczyły granic 2208 x 1242 (x3) i odpowiednio skalowane na urządzeniu.

Symulator nie ma dostępu do tego samego sprzętu, który wykonuje skalowanie na urządzeniu, i nie ma zbyt wiele korzyści z symulacji w oprogramowaniu, ponieważ przyniosłyby one inne wyniki niż sprzęt. Dlatego sensowne jest ustawienie nativeBoundsekranu głównego symulowanego urządzenia w granicach ekranu głównego urządzenia fizycznego.

iOS 8 dodał API do UIScreen( nativeScalei nativeBounds), aby umożliwić programistom określenie rozdzielczości CADisplayodpowiadającej UIScreen.

Jeremy Huddleston Sequoia
źródło
13

Dla tych, którzy zastanawiają się, jak traktowane są starsze aplikacje, przeprowadziłem trochę testów i obliczeń na ten temat.

Dzięki podpowiedzi @ hannes-sverrisson zacząłem przy założeniu, że starsza aplikacja jest traktowana w widoku 320x568 w telefonie iPhone 6 i iPhone 6 plus.

Test został wykonany na prostym czarnym tle [email protected]z białą obwódką. Tło ma rozmiar 640 x 1136 pikseli i jest czarne z wewnętrzną białą ramką 1 piksela.

Poniżej znajdują się zrzuty ekranu dostarczone przez symulator:

Na zrzucie ekranu iPhone'a 6 widzimy margines 1 piksela na górze i na dole białej ramki oraz 2-pikselowy margines na ekranie iPhone'a 6 plus. To daje nam zużytą przestrzeń 1242 x 2204 na iPhone 6 plus zamiast 1242 x 2208 i 750 x 1332 na iPhone 6 zamiast 750 x 1334.

Możemy założyć, że te martwe piksele mają respektować proporcje iPhone'a 5:

iPhone 5               640 / 1136 = 0.5634
iPhone 6 (used)        750 / 1332 = 0.5631
iPhone 6 (real)        750 / 1334 = 0.5622
iPhone 6 plus (used)  1242 / 2204 = 0.5635
iPhone 6 plus (real)  1242 / 2208 = 0.5625

Po drugie, ważne jest, aby wiedzieć, że zasoby @ 2x będą skalowane nie tylko na iPhonie 6 plus (który oczekuje zasobów @ 3x), ale także na iPhonie 6. Prawdopodobnie dlatego, że brak skalowania zasobów doprowadziłby do nieoczekiwanych układów, z powodu do powiększenia widoku.

Skalowanie to nie jest jednak równoważne pod względem szerokości i wysokości. Próbowałem z zasobem 264 x 264 @ 2x. Biorąc pod uwagę wyniki, muszę założyć, że skalowanie jest wprost proporcjonalne do stosunku pikseli do punktów.

Device         Width scale             Computed width   Screenshot width
iPhone 5        640 /  640 = 1.0                        264 px
iPhone 6        750 /  640 = 1.171875  309.375          309 px
iPhone 6 plus  1242 /  640 = 1.940625  512.325          512 px

Device         Height scale            Computed height  Screenshot height
iPhone 5       1136 / 1136 = 1.0                        264 px
iPhone 6       1332 / 1136 = 1.172535  309.549          310 px
iPhone 6 plus  2204 / 1136 = 1.940141  512.197          512 px

Ważne jest, aby pamiętać, że skalowanie iPhone'a 6 nie jest takie samo pod względem szerokości i wysokości (309 x 310). Potwierdza to powyższą teorię, że skalowanie nie jest proporcjonalne w szerokości i wysokości, ale wykorzystuje stosunek pikseli do punktów.

Mam nadzieję, że to pomoże.

François Verry
źródło
12

Sprawdź tę infografikę: http://www.paintcodeapp.com/news/iphone-6-screens-demystified

Wyjaśnia różnice między starymi iPhone'ami, iPhone'ami 6 i iPhone'ami 6 Plus. Możesz zobaczyć porównanie rozmiarów ekranu w punktach, renderowanych pikselach i pikselach fizycznych. Znajdziesz tam również odpowiedź na swoje pytanie:

iPhone 6 Plus - z wyświetlaczem Retina HD. Współczynnik skalowania wynosi 3, a następnie obraz jest skalowany w dół z renderowanych 2208 × 1242 pikseli do 1920 × 1080 pikseli.

Współczynnik skalowania w dół wynosi 1920/2208 = 1080/1242 = 20 / 23. Oznacza to, że każde 23 piksele z oryginalnego renderowania muszą być odwzorowane na 20 pikseli fizycznych. Innymi słowy obraz jest zmniejszany do około 87% jego pierwotnego rozmiaru.

Aktualizacja:

Istnieje wspomniana powyżej zaktualizowana wersja infografiki. Zawiera bardziej szczegółowe informacje o różnicach rozdzielczości ekranu i obejmuje wszystkie dotychczasowe modele iPhone'a, w tym urządzenia 4-calowe.

http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

Darrarski
źródło
Więc nawet przy wyłączonym wygładzaniu istnieje opcjonalny wygładzanie, które działa w trakcie skalowania w dół?
Sam
Gdyby ta infografika zawierała 4-calowy ekran, byłby niesamowity.
Rajesh
@Rajesh Zaktualizowałem swoją odpowiedź, sprawdź ją teraz, aby uzyskać informacje na temat urządzeń 4-calowych.
Darrarski
4

Nawet jeśli ogólnie nie lubię tonu blogu Daring Fireball Johna Grubera, jego Większa hipoteza wyświetlacza iPhone'a jest warta przeczytania.

Zgadł, ale dokładnie uzyskał zarówno rozdzielczość w punktach, jak i pikselach dla obu modeli, z tym wyjątkiem, że nie spodziewał się (ja też), że Apple zbuduje fizyczny wyświetlacz o niższej rozdzielczości i zmniejszy skalę (szczegóły w odpowiedzi @ Tommy'ego).

Istotą tego wszystkiego jest to, że należy przestać myśleć w kategoriach pikseli i zacząć myśleć w kategoriach punktów (tak było od dłuższego czasu, nie jest to nowy wynalazek) i wynikającej z tego fizycznej wielkości elementów interfejsu użytkownika. Krótko mówiąc, oba nowe modele iPhone'a poprawiają się pod tym względem, ponieważ fizycznie większość elementów pozostaje tego samego rozmiaru, możesz po prostu zmieścić ich więcej na ekranie (dla każdego większego ekranu zmieścisz więcej).

Jestem tylko trochę rozczarowany, że nie zachowali mapowania wewnętrznej rozdzielczości na rzeczywistą rozdzielczość ekranu 1: 1 dla większego modelu.

czysta moc
źródło
myślimy w punktach, ale niestety musimy tworzyć obrazy w pikselach w Photoshopie ... 😃
Duck
2
Piksele są ważne dla wielu z wielu powodów. Podczas gdy Apple ma swoje własne myśli policyjne w tym temacie, niechętnie dodali [UIScreen nativeBounds] w iOS8 z bardzo dobrych powodów.
ctpenrose
Tak, piksele są również ważne, ale dla zasobów statycznych, takich jak obrazy (ekrany powitalne i tym podobne). Miałem na myśli (zamierzona gra słów) raczej układ ekranu aplikacji, rzeczy rysowane dynamicznie.
rawpower