Jaki byłby najwłaściwszy sposób na uzyskanie górnej i dolnej wysokości w niebezpiecznych obszarach na nowym iPhonie X?
ios
iphone-x
safearealayoutguide
Tulleb
źródło
źródło
keyWindow
zawsze byłonil
tak, że zmieniłem to nawindows[0]
i usunąłem?
z opcjonalnego łańcucha, a potem zadziałało.Aby uzyskać wysokość między prowadnicami układu, po prostu zrób
Więc
full frame height = 812.0
,safe area height = 734.0
Poniżej znajduje się przykład, w którym zielony widok ma ramkę
guide.layoutFrame
źródło
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, który ma bezpieczną ramkę.Swift 4, 5
Przypięcie widoku do zakotwiczenia obszaru bezpiecznego przy użyciu ograniczeń można wykonać w dowolnym miejscu cyklu życia kontrolera widoku, ponieważ są one kolejkowane przez interfejs API i obsługiwane po załadowaniu widoku do pamięci. Jednak uzyskanie wartości obszaru bezpiecznego wymaga czekania pod koniec cyklu życia kontrolera widoku, na przykład
viewDidLayoutSubviews()
.To podłącza się do dowolnego kontrolera widoku:
Wolę tę metodę niż wyrzucenie jej z okna (jeśli to możliwe), ponieważ tak zaprojektowano interfejs API, a co ważniejsze, wartości są aktualizowane podczas wszystkich zmian widoku, takich jak zmiany orientacji urządzenia.
Jednak niektóre niestandardowe kontrolery widoku prezentowanego nie mogą korzystać z powyższej metody (podejrzewam, że są w przejściowych widokach kontenerów). W takich przypadkach można pobrać wartości z głównego kontrolera widoku, który zawsze będzie dostępny w dowolnym miejscu w cyklu życia bieżącego kontrolera widoku.
źródło
viewDidLayoutSubviews
(które można wywołać wielokrotnie), oto rozwiązanie, które zadziała nawet naviewDidLoad
: stackoverflow.com/a/53864017/7767664Żadna z innych odpowiedzi tutaj nie zadziałała, ale tak się stało.
źródło
Wszystkie odpowiedzi tutaj są pomocne. Dziękujemy wszystkim, którzy zaoferowali pomoc.
Jednak, jak widzę, ten temat dotyczący bezpiecznego obszaru jest nieco zagmatwany, co nie wydaje się być dobrze udokumentowane.
Więc podsumuję to tutaj jak najdokładniej, aby ułatwić zrozumienie
safeAreaInsets
,safeAreaLayoutGuide
iLayoutGuide
.W iOS 7 firma Apple wprowadziła właściwości
topLayoutGuide
ibottomLayoutGuide
w.UIViewController
Pozwoliły one na tworzenie ograniczeń, aby zawartość nie była ukrywana przez paski UIKit, takie jak pasek stanu, nawigacja lub pasek kart. Dzięki tym przewodnikom po układzie można było określić ograniczenia zawartości, unikając jej być ukryte przez górne lub dolne elementy nawigacyjne (paski UIKit, pasek stanu, pasek nawigacji lub pasek kart…).Na przykład, jeśli chcesz, aby tableView zaczynał się od górnego ekranu, zrobiłeś coś takiego:
W iOS 11 firma Apple wycofała te właściwości, zastępując je przewodnikiem po układzie pojedynczego bezpiecznego obszaru
Obszar bezpieczny według Apple
Poniżej bezpieczny obszar wyróżniony w iPhone'ach 8 i iPhone'ach X:
safeAreaLayoutGuide
Jest właściwościąUIView
Aby uzyskać wysokość
safeAreaLayoutGuide
:To zwróci wysokość strzałki na twoim zdjęciu.
A co z uzyskaniem górnego „wycięcia” i dolnych wysokości wskaźników ekranu głównego?
Tutaj użyjemy
safeAreaInsets
Poniższy rysunek przedstawia niebezpieczny obszar i odległość od krawędzi w telefonie iPhone 8 i iPhone X-Series.
Teraz, jeśli dodano pasek nawigacji
Jak więc teraz uzyskać wysokość obszaru niebezpiecznego? użyjemy
safeAreaInset
Oto rozwiązania, które jednak różnią się ważną rzeczą,
Pierwszy:
To zwróci EdgeInsets, możesz teraz uzyskać dostęp do góry i dołu, aby poznać wstawki,
Drugi:
Pierwszy z nich jest wstawiany do widoku, więc jeśli istnieje pasek nawigacji, zostanie on uwzględniony, jednak drugi, do którego uzyskujesz dostęp do safeAreaInsets okna, więc pasek nawigacji nie będzie brany pod uwagę
źródło
W iOS 11 istnieje metoda, która informuje, kiedy zmienił się safeArea.
źródło
Pracuję z frameworkami CocoaPods i na wypadek, gdyby
UIApplication.shared
był niedostępny , używamsafeAreaInsets
w widokachwindow
:źródło
safeAreaLayoutGuide Gdy widok jest widoczny na ekranie, ten przewodnik odzwierciedla część widoku, która nie jest zakryta przez paski nawigacji, paski kart, paski narzędzi i inne widoki przodków. (W systemie tvOS bezpieczny obszar odzwierciedla obszar nie zakryty ramką ekranu). Jeśli widok nie jest obecnie zainstalowany w hierarchii widoków lub nie jest jeszcze widoczny na ekranie, krawędzie prowadnicy układu są równe krawędziom widoku.
Następnie, aby uzyskać wysokość czerwonej strzałki na zrzucie ekranu, jest to:
źródło
Swift 5, Xcode 11.4
Daje ostrzeżenie o wycofaniu. Opcja „keyWindow” została wycofana w iOS 13.0: nie powinna być używana dla aplikacji obsługujących wiele scen, ponieważ zwraca okno klucza we wszystkich połączonych scenach ”z powodu połączonych scen. Używam w ten sposób.
źródło
Objective-C Kto miał problem, gdy keyWindow jest równe nil . Po prostu umieść powyższy kod w viewDidAppear (nie w viewDidLoad )
źródło
źródło
Rozszerzenie Swift 5
Może być używane jako rozszerzenie i wywoływane z: UIApplication.topSafeAreaHeight
Rozszerzenie UIApplication jest opcjonalne, może być rozszerzeniem UIView lub czymkolwiek jest preferowane, lub prawdopodobnie nawet lepiej funkcją globalną.
źródło
Bardziej zaokrąglone podejście
źródło