Uruchomiłem następujący kod zarówno w systemie iOS 7, jak i iOS 8:
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
BOOL landscape = (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight);
NSLog(@"Currently landscape: %@, width: %.2f, height: %.2f",
(landscape ? @"Yes" : @"No"),
[[UIScreen mainScreen] bounds].size.width,
[[UIScreen mainScreen] bounds].size.height);
Oto wynik z iOS 8:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 568.00, height: 320.00
W porównaniu do wyniku w iOS 7:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 320.00, height: 568.00
Czy istnieje dokumentacja określająca tę zmianę? Czy jest to tymczasowy błąd w interfejsach API systemu iOS 8?
Odpowiedzi:
Tak, to zależy od orientacji w iOS8, a nie błąd. Możesz przejrzeć sesję 214 z WWDC 2014, aby uzyskać więcej informacji: „Zobacz postępy kontrolera w iOS 8”
Cytat z prezentacji:
UIScreen jest teraz zorientowany na interfejs:
źródło
Tak, zależy od orientacji w iOS8.
Napisałem metodę Util, aby rozwiązać ten problem dla aplikacji, które muszą obsługiwać starsze wersje systemu operacyjnego.
źródło
Tak, rzeczywiście, rozmiar ekranu jest teraz zależny od orientacji w iOS 8. Czasami jednak pożądane jest, aby uzyskać rozmiar ustawiony na orientację pionową. Oto jak to robię.
źródło
Tak, teraz zależy to od orientacji.
Wolę poniższą metodę uzyskiwania rozmiaru ekranu w sposób niezależny od orientacji od niektórych powyższych odpowiedzi, zarówno dlatego, że jest prostszy, jak i ponieważ nie zależy od żadnego kodu orientacji (którego stan może zależeć od czas ich wywołania) lub podczas sprawdzania wersji. Możesz chcieć nowego zachowania iOS 8, ale zadziała, jeśli chcesz, aby był stabilny we wszystkich wersjach iOS.
źródło
Powiązane z tym pytaniem, ponieważ rozwiązało mój problem, tutaj dwie definicje używam do obliczeń szerokości i wysokości ekranu:
Jeśli obsługujesz zarówno iOS 7, jak i iOS 8, jest to najlepsze rozwiązanie tego problemu.
źródło
Możesz użyć
nativeBounds
(niezależnie od orientacji)nativeBounds
Wykrywanie wysokości urządzenia:
Wykrywanie szerokości urządzenia:
źródło
To nie jest błąd w zestawie SDK iOS 8. Uzależnili orientację interfejsu granic. Zgodnie z twoim pytaniem o odniesienie lub dokumentację tego faktu gorąco polecam obejrzenie
View Controller Advancements in iOS 8
214 sesji z WWDC 2014 . Najciekawsza część (według twoich wątpliwości)Screen Coordinates
zaczyna się o 50:45.źródło
Tak, zależy od orientacji w iOS8.
Oto, w jaki sposób możesz uzyskać spójny sposób odczytywania granic w stylu iOS 8 w wersjach SDK i OS.
źródło
Moje rozwiązanie to połączenie MaxK i hfossli. Zrobiłem tę metodę na kategorii UIScreen i nie ma ona kontroli wersji (co jest złą praktyką):
źródło
Potrzebowałem funkcji szybkiego pomocnika, która zachowałaby to samo zachowanie, co iOS7 pod iOS8 - to pozwoliło mi zamienić moje
[[UIScreen mainScreen] bounds]
połączenia i nie dotykać innego kodu ...źródło
Poniższej metody można użyć do znalezienia granic ekranu dla danej orientacji, niezależnie od wersji iOS. Ta metoda zwróci granice na podstawie rozmiaru ekranu urządzenia i da tę samą wartość CGRect niezależnie od wersji iOS.
źródło
Właśnie tego użyłem do obliczenia poprawnego odbicia:
źródło
Właśnie dodałem szybką wersję doskonałej funkcji cbartel, na którą odpowiedziano powyżej.
źródło
Mój problem związany był z ramką UIWindows, która działała w minusie. Więc utworzyłem kod jak poniżej w MyViewController - (NSUInteger) obsługiwaneInterfaceOrientations Metoda
I jego praca dla mnie spróbuj.
źródło
iOS 8 lub nowszy
Rozwiązaniem dla tych, którzy chcą dowiedzieć się rozmiar ekranu w punktach (ekran 3,5 cala ma 320 x 480 punktów, ekran 4,0 cala ma 320 x 568 punktów itp.),
źródło
Zwróciłem uwagę na to, że kolejność obsługiwanych orientacji interfejsu w Info.plist ma znaczenie. Mam problem z tym pytaniem w mojej aplikacji (która orientuje się w kodzie), ale nigdzie nie określiłem, że domyślna orientacja to Portret.
W każdym razie myślałem, że domyślną orientacją jest Portret.
Przestawienie itens w Info.plist, stawiając Portret na pierwszym miejscu, przywróciło oczekiwane zachowanie.
źródło
To da prawidłowe urządzenie w iOS7 i iOS8 zarówno,
// Możesz również dodać więcej urządzeń (ieiPad).
źródło
Użyto nieco zmodyfikowanego rozwiązania mnemii, tego bez sprawdzania wersji iOS, używając min / max na granicach ekranu głównego.
I potrzebna jest
CGRect
więc dostałCGRect
od mainScreen granice i zmieniłsize.width=min(w,h)
,size.height=max(w,h)
. Następnie nazwałem tę niezależną od systemu operacyjnegoCGRect
funkcję get w dwóch miejscach w kodzie, gdzie otrzymuję rozmiar ekranuOpenGL
, dotknięcia itp. Przed naprawą miałem 2 problemy - na IOS 8.x w trybie poziomym pozycjaOpenGL
wyświetlania była nieprawidłowa: 1 / 4 pełnego ekranu w lewej dolnej części. Drugie dotknięcia zwróciły nieprawidłowe wartości. Oba problemy zostały naprawione, jak wyjaśniono. Dzięki!źródło