Właśnie uaktualniłem do XCode 4.5 GM i odkryłem, że możesz teraz zastosować rozmiar „4” Retina do kontrolera widoku w serii ujęć.
Teraz, jeśli chcę utworzyć aplikację działającą zarówno na iPhonie 4, jak i 5, oczywiście muszę zbudować każde okno dwa razy, ale muszę też sprawdzić, czy użytkownik ma iPhone'a z ekranem 3,5 "lub 4", a następnie zastosować widok.
Jak mam to zrobić?
Odpowiedzi:
Przede wszystkim nie należy odbudowywać wszystkich widoków, aby zmieściły się na nowym ekranie, ani nie używać różnych widoków dla różnych rozmiarów ekranu.
Korzystaj z funkcji automatycznego zmiany rozmiaru systemu iOS, aby Twoje widoki mogły dostosowywać i dostosowywać dowolny rozmiar ekranu.
To nie jest bardzo trudne, przeczytaj dokumentację na ten temat. Zaoszczędzi ci dużo czasu.
iOS 6 oferuje również nowe funkcje w tym zakresie.
Przeczytaj dziennik zmian interfejsu API systemu iOS 6 w witrynie Apple Developer.
I sprawdź nowe możliwości AutoLayout dla iOS 6 .
To powiedziawszy, jeśli naprawdę potrzebujesz wykryć iPhone'a 5, możesz po prostu polegać na rozmiarze ekranu .
Wysokość ekranu iPhone'a 5 wynosi 568.
Możesz wyobrazić sobie makro, aby uprościć to wszystko:
Zastosowanie
fabs
epsilon ma na celu zapobieganie błędom precyzji podczas porównywania zmiennoprzecinkowych, jak wskazano w komentarzach H2CO3.Od teraz możesz używać go w standardowych instrukcjach if / else:
Edycja - lepsze wykrywanie
Jak twierdzą niektóre osoby, wykrywa to tylko ekran panoramiczny , a nie rzeczywisty iPhone 5.
Kolejne wersje iPoda touch mogą mieć taki ekran, więc możemy użyć innego zestawu makr.
Zmieńmy nazwę oryginalnego makra
IS_WIDESCREEN
:Dodajmy makra do wykrywania modeli:
W ten sposób możemy upewnić się, że mamy model iPhone'a ORAZ ekran panoramiczny, i możemy ponownie zdefiniować
IS_IPHONE_5
makro:Należy również pamiętać, że, jak stwierdził @ LearnCocos2D, te makra nie będą działać, jeśli aplikacja nie zostanie zoptymalizowana pod kątem ekranu iPhone'a 5 (brakuje obrazu [email protected]), ponieważ rozmiar ekranu nadal będzie wynosił 320 x 480 sprawa.
Nie sądzę, że może to stanowić problem, ponieważ nie rozumiem, dlaczego chcielibyśmy wykryć iPhone'a 5 w niezoptymalizowanej aplikacji.
WAŻNE - obsługa iOS 8
W iOS 8
bounds
właściwośćUIScreen
klasy odzwierciedla teraz orientację urządzenia .Tak więc oczywiście poprzedni kod nie zadziała po wyjęciu z pudełka.
Aby to naprawić, możesz po prostu użyć nowej
nativeBounds
właściwości zamiastbounds
, ponieważ nie zmieni się ona wraz z orientacją i ponieważ jest oparta na trybie portretowym.Pamiętaj, że wymiary
nativeBounds
są mierzone w pikselach, więc dla iPhone'a 5 wysokość wyniesie 1136 zamiast 568.Jeśli kierujesz reklamy również na iOS 7 lub niższy, pamiętaj o wykrywaniu funkcji, ponieważ dzwonienie
nativeBounds
przed iOS 8 spowoduje awarię aplikacji:Możesz dostosować poprzednie makra w następujący sposób:
I oczywiście, jeśli chcesz wykryć iPhone'a 6 lub 6 Plus, użyj odpowiednich rozmiarów ekranu.
źródło
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
nie jest tutaj konieczne i że==
porównanie się nie powiedzie: konieczne jest wykonanie porównania z wykorzystaniem różnic w ten sposób, jeśli wartość zmiennoprzecinkowa nie może być wyrażona jako dokładna liczba (jak1.0/3.0*3.0
na przykład). Przeczytaj ten artykuł, aby uzyskać więcej informacji;)Testowane i zaprojektowane pod kątem dowolnej kombinacji zestawu SDK i systemu operacyjnego:
Szybki
Dodano typy iPadów. iPad 2 i iPad mini to iPady bez siatkówki. Podczas gdy iPad Mini 2 i nowszy, iPad 3, 4, iPad Air, Air 2, Air 3 i iPad Pro 9.7 mają tę samą logiczną rozdzielczość 1024. iPad Pro ma maksymalną długość 1366. Odniesienie
Zobacz to w akcji https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Uwaga: Jeśli np. IPhone 6 jest w trybie powiększenia, interfejs użytkownika jest powiększoną wersją iPhone'a 5. Te funkcje nie określają typu urządzenia, ale tryb wyświetlania, dlatego iPhone 5 jest pożądanym wynikiem w tym przykładzie.
Cel C
Zastosowanie: http://pastie.org/9687735
Uwaga: Jeśli np. IPhone 6 jest w trybie powiększenia, interfejs użytkownika jest powiększoną wersją iPhone'a 5. Te funkcje nie określają typu urządzenia, ale tryb wyświetlania, dlatego iPhone 5 jest pożądanym wynikiem w tym przykładzie.
źródło
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
określenie różnicy między iPhone4 i iPhone5 a iPad Retina i non-retinaSCREEN_MAX_LENGTH
aby uzyskać 568 we wszystkich obrotach na iPhonie 5.Naprawdę proste rozwiązanie
źródło
Teraz musimy uwzględnić rozmiary ekranów iPhone'a 6 i 6Plus. Oto zaktualizowana odpowiedź
Kilka przydatnych informacji
źródło
Wziąłem wolność umieścić makro przez Macmade do funkcji C, i nazwać go poprawnie, ponieważ wykrywa panoramiczny dostępności i nie koniecznie iPhone 5.
Makro również nie wykrywa działania na iPhonie 5 w przypadku, gdy projekt nie zawiera [email protected] . Bez nowego domyślnego obrazu iPhone 5 będzie zgłaszał normalny rozmiar ekranu 480 x 320 (w punktach). Zatem sprawdzenie nie dotyczy tylko dostępności ekranu panoramicznego, ale także włączenia trybu panoramicznego .
źródło
inline
d. Zostaną również wstawione tam, gdzie optymalizator kompilatora uważa, że to dobry pomysł i gdzie może wiedzieć, że jest to dozwolone (np. Funkcja jest w tym samym module). Implementacja takich rzeczy za pomocą funkcji może czasem przynieść dodatkowe sprawdzanie typu.Oto nasze kody, test zdany na ios7 / ios8 dla iphone4, iphone5, ipad, iphone6, iphone6p, bez względu na urządzenia lub symulator:
źródło
Użyłem odpowiedzi hfossli i przetłumaczyłem ją na Swift
źródło
to jest makro dla mojego projektu cocos2d. powinny być takie same dla innych aplikacji.
źródło
źródło
W projekcie Swift, iOS 8+ lubię tworzyć rozszerzenia
UIScreen
, takie jak:(UWAGA:
nativeBounds
jest w pikselach).A wtedy kod będzie wyglądał następująco:
Dlatego kod wyjaśnia, że jest to sprawdzenie ekranu głównego, a nie modelu urządzenia.
źródło
Pożyczając od odpowiedzi Samrata Mazumdara, oto krótka metoda, która szacuje rozmiar ekranu urządzenia. Działa z najnowszymi urządzeniami, ale może nie działać na przyszłych (jak wszystkie metody zgadywania). Zostanie również zdezorientowany, jeśli urządzenie jest dublowane (zwraca rozmiar ekranu urządzenia, a nie rozmiar ekranu dublowanego)
źródło
Myślę, że dobrze by było, gdyby to makro działało w urządzeniu i symulatorze, poniżej znajduje się rozwiązanie.
źródło
Odkryłem, że odpowiedzi nie obejmują specjalnego przypadku dla symulatorów.
źródło
źródło
iPhone5 = FALSE;
jest niepotrzebne, ponieważ zmienna ma już tę wartość, jeśli się nie zmieniźródło
Poleganie na rozmiarze jest błędne na tak wielu poziomach. Co powiesz na system?
Zaczerpnięty z najlepszego sposobu wykrywania typu sprzętu, iPhone4 lub iPhone5? , odpowiedź edzio27.
źródło
W ten sposób możesz wykryć rodzinę urządzeń.
źródło
Jeśli projekt został utworzony przy użyciu Xcode 6, użyj poniższego kodu do wykrycia urządzeń.
Jeśli projekt został utworzony w Xcode 5 i otwarty w Xcode 6, użyj poniższego kodu do wykrycia urządzeń (ten kod działa, jeśli nie są przypisane żadne obrazy uruchamiania dla iPhone'a 6,6+)
Jeśli nadal używasz Xcode 5 razem, użyj następującego kodu do wykrycia urządzeń (iPhone 6 i 6+ nie zostaną wykryte)
źródło
Dodaj „Nowy plik Swift” ->
AppDelegateEx.swift
dodaj rozszerzenie do
AppDelegate
stosowanie:
źródło
W Swift 3 możesz użyć mojej prostej klasy KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Jest dobrze udokumentowany i obsługuje operatorów ==,> =, <=.
Na przykład, aby wykryć, czy urządzenie ma ograniczenia iPhone'a 6 / 6s / 7, możesz po prostu użyć następnego porównania:
Aby wykryć, czy urządzenie ma ograniczenia iPhone'a 5 / 5S / SE lub starszego (iPhone 4s), możesz użyć następnego porównania:
źródło
Odpowiedziano na to sto razy, ale to rozwiązanie działało dla mnie najlepiej i pomogło rozwiązać problem, gdy wprowadzane są nowe urządzenia i nie mam zdefiniowanego rozmiaru.
Swift 5 Helper:
Wynika to z faktu, że łatwo jest zapamiętać rozmiary cali telefonu, takie jak urządzenie „5,5 cala” lub „4,7 cala”, ale trudno jest zapamiętać dokładne rozmiary pikseli.
Daje to również możliwość zrobienia czegoś takiego:
Domyślnie: próbuje zastosowań rozmiar ekranu i skalę, aby spróbować i obliczyć cali przekątnej. Dzieje się tak w przypadku, gdy pojawi się nowy rozmiar urządzenia, postaramy się jak najlepiej ustalić, a kod, taki jak ostatni przykład, powinien nadal działać.
źródło
użyj następującego kodu:
źródło
Oto poprawny test urządzenia, bez względu na orientację
źródło
Służy do wykrywania urządzeń iPhone i iPad wszystkich wersji.
źródło
IS_RETINA
na iPhone 6 plus, wykonywany jest kod 1x?@1x
tam, gdzie powinny@3x
. w każdym razie: jak tylko kopiujesz i