Tworzę strukturę wielokrotnego użytku do wyświetlania powiadomień w aplikacji na iOS. Chciałbym, aby widoki powiadomień były dodawane ponad wszystko inne w aplikacji, coś w rodzaju UIAlertView. Kiedy uruchamiam menedżera, który nasłuchuje zdarzeń NSNotification i w odpowiedzi dodaje widoki, potrzebuję odwołania do najwyższego widoku w aplikacji. Oto co mam w tej chwili:
_topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
Czy zadziała to w przypadku dowolnej aplikacji na iOS, czy też jest to bezpieczniejszy / lepszy sposób na uzyskanie widoku z góry?
źródło
(null)
do mojej aplikacji na iOS-8 (problem ze scenorysami?) Jakieś wskazówki? Dzięki! (Uwaga:(null)
zwrócono zarówno o godzinie, jakviewDidLoad
ioviewWillAppear:
godzinie.viewDidAppear:
Jest za późno.Istnieją dwie części problemu: okno górne, widok z góry w oknie górnym.
Wszystkie istniejące odpowiedzi pominęły górną część okna. Ale
[[UIApplication sharedApplication] keyWindow]
nie ma gwarancji, że będzie to górne okno.Górne okno. Jest bardzo mało prawdopodobne, aby
windowLevel
dla aplikacji istniały dwa takie same okna , więc możemy posortować wszystkie oknawindowLevel
i uzyskać najwyższe.Widok z góry w górnym oknie. Żeby być kompletnym. Jak już wskazano w pytaniu:
źródło
topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
W rzeczywistości w aplikacji może znajdować się więcej niż jedno okno UIWindow. Na przykład, jeśli klawiatura jest na ekranie,
[[UIApplication sharedApplication] windows]
będzie zawierała co najmniej dwa okna (okno z klawiszami i okno klawiatury).Więc jeśli chcesz, aby twój widok pojawił się na obu z nich, musisz zrobić coś takiego:
(Zakładając, że lastObject zawiera okno z najwyższym priorytetem windowLevel).
źródło
Trzymam się pytania zgodnie z tytułem, a nie dyskusją. Który widok jest widoczny z góry w danym punkcie?
Może być używany bezpośrednio z dowolnym UIWindow jako odbiornikiem lub dowolnym UIView jako odbiornikiem.
źródło
Jeśli dodajesz widok ładowania (na przykład widok wskaźnika aktywności), upewnij się, że masz obiekt klasy UIWindow. Jeśli pokażesz arkusz akcji tuż przed pokazaniem widoku ładowania,
keyWindow
będzie toUIActionSheet
i nieUIWindow
. A ponieważ arkusz akcji zniknie, widok ładowania zniknie wraz z nim. Albo właśnie to sprawiało mi problemy.źródło
Jeśli Twoja aplikacja działa tylko w orientacji pionowej, to wystarczy:
Twój widok nie będzie widoczny na klawiaturze i pasku stanu.
Jeśli chcesz uzyskać najwyższy widok, który znajduje się na klawiaturze lub pasku stanu, lub chcesz, aby najwyższy widok mógł się poprawnie obracać z urządzeniami, wypróbuj tę strukturę:
https://github.com/HarrisonXi/TopmostView
Obsługuje iOS7 / 8/9.
źródło
Po prostu użyj tego kodu, jeśli chcesz dodać widok powyżej wszystkiego na ekranie.
źródło
Spróbuj tego
źródło
źródło