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ę
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ę
Odpowiedzi:
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.
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ć.
[UIScreen mainScreen].bounds.size.height
zwraca 736 w symulatorze iPhone'a 6+ w trybie portretowym. Jest to wartość 2208 podzielona przez skalę 3. Szerokość wynosi 414.
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.
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
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 nativeScale
i scale
nie 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.
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"
Prawdopodobnie powinieneś przestać używać obrazów uruchamiania w iOS 8 i używać scenorysu lub stalówki / Xib.
W Xcode 6 otwórz File
menu i wybierz New
⟶ File...
⟶ iOS
⟶ User Interface
⟶ Launch Screen
.
Następnie otwórz ustawienia swojego projektu, klikając go.
W General
zakładce w sekcji o nazwie App Icons and Launch Images
, należy ustawić Launch Screen File
dla właśnie utworzonych plików (będzie ustawiona UILaunchStoryboardName
w 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:
Konfigurowanie projektu do używania pliku xib ekranu uruchamiania zamiast katalogu zasobów:
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 CALayers
tym 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 UIKit
bę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 nativeBounds
ekranu głównego symulowanego urządzenia w granicach ekranu głównego urządzenia fizycznego.
iOS 8 dodał API do UIScreen
( nativeScale
i nativeBounds
), aby umożliwić programistom określenie rozdzielczości CADisplay
odpowiadającej UIScreen
.
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 bg@2x.png
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.
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
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.