Zalety, problemy, przykłady dodania kolejnego UIWindow do aplikacji na iOS?

92

Ostatnio zastanawiałem się, czy aplikacja na iOS ma tylko jedną UIWindow. Wydaje się, że utworzenie innego UIWindowi umieszczenie go na ekranie nie stanowi problemu .

Moje pytanie jest niejasne, ale interesuje mnie:

  • Co potencjalnie mógłbym osiągnąć przez sekundę UIWindow, czego nie można zrobić w inny sposób?
  • Co może się nie udać podczas korzystania z wielu UIWindowinstancji?
  • Widziałem, że ludzie używają drugiego, UIWindowaby wyświetlać popover jak widoki na iPhonie. Czy to dobry sposób na zrobienie tego? Czemu? Dlaczego nie?
  • Czy są inne przykłady, w których posiadanie innego ma sens UIWindow?

Nie chodzi o to, że czegoś mi brakuje. Nigdy nie czułem potrzeby tworzenia kolejnej UIWindowinstancji, ale może pozwoliłoby to na zrobienie niesamowitych rzeczy, których nie jestem świadomy! :-)

Mam nadzieję, że pomoże mi to rozwiązać ten problem: muszę dodać „widok okładki” nad tym, co jest aktualnie wyświetlane. Powinien również działać, jeśli jest już przedstawiony jeden lub więcej kontrolerów modalnych. Jeśli dodam a UIViewdo widoku kontrolera głównego, kontrolery modalne znajdują się na górze, podobnie jak kontrolery popover. Jeśli przedstawię widok okładki modalnie i jest już kontroler modalny, zasłonięta jest tylko część ekranu.

Krumelur
źródło
Korzystanie z wielu UIWindows w aplikacjach na iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Odpowiedzi:

27

A UIWindowmoże unosić się nad innymi elementami interfejsu użytkownika, takimi jak klawiatura systemowa.

Aby odnieść się do ostatniego akapitu: utwórz UIWindowramkę z taką samą ramką, jak w oknie głównym. Ustaw jego windowLevelwłaściwość na UIWindowLevelStatusBar. Ustaw jego hiddenwłaściwość na NO.

rob mayoff
źródło
Eee, w porządku. Dzięki. Wiedziałem to. Czy możesz podać więcej szczegółów na moje pytania? Czy wiesz, jak uzyskać RID sekundowego UIWindow dodanego przez makeKeyAndVisible?
Krumelur
Ustaw właściwość hidden UIWindow na YES.
rob mayoff
Dzięki. I pokazuję okno, ustawiając je jako kluczowe i widoczne? I ukrywam to, pokazując INNE okno i po prostu usuwając drugie? Jak mogę animować UIWindow, takie jak UIActionSheet?
Krumelur
Uważaj z tym. Jeśli na! = UIWindowLevelNormal, klawiatura zostanie wyświetlona pod nią na <iOS7.
Shawn,
108

Zaczynając od odpowiedzi Roba, trochę się pobawiłem i chciałbym zapisać kilka uwag dla innych, próbujących uzyskać informacje na ten temat:

  • Dodanie kolejnego nie stanowi żadnego problemu UIWindow. Po prostu utwórz i makeKeyAndVisible. Gotowe.
  • Usuń go, wyświetlając kolejne okno, a następnie zwolnij to, którego już nie potrzebujesz.
  • Okno, które jest „kluczem”, otrzymuje wszystkie dane z klawiatury.
  • UIWindow obejmuje wszystko, nawet modale, popover itp. Genialnie!
  • UIWindowjest zawsze ukrytym portretem. Nie obraca się. Będziesz musiał dodać kontroler jako główny kontroler nowego okna i pozwolić mu na obrót. (Podobnie jak w oknie głównym)
  • Poziom okna określa, jak „wysoko” zostanie wyświetlone. Ustaw go tak, UIWindowLevelStatusBaraby obejmował wszystko. Ustaw jego hiddenwłaściwość na NIE.
  • Drugiego UIWindowmożna użyć, aby wyświetlić widoki na ekranie, które unoszą się nad wszystkim. Bez tworzenia fałszywego kontrolera tylko po to, aby osadzić go w pliku UIPopoverController.
  • Może być szczególnie przydatny na iPhonie, gdzie nie ma kontrolera typu popover, ale możesz chcieć naśladować coś takiego.
  • I tak, rozwiązało to oczywiście mój problem: jeśli aplikacja zrezygnuje z aktywacji, dodaj okno okładki na to, co jest obecnie wyświetlane, aby uniemożliwić iOS wykonanie zrzutu ekranu aktualnej zawartości aplikacji.
Krumelur
źródło
Nie miałbym odwagi użyć innego UIWindow, gdyby nie twoja odpowiedź. Było to również niezwykle pomocne, ponieważ drugie okno UIWindow nie uruchamiało się samoistnie.
Dan Abramov,
1
Bardzo pouczający post. Ale co się stanie, jeśli zrezygnujesz z tego okna i sprawisz, że podstawowy klucz okna będzie widoczny i widoczny, a rootViewController tego podstawowego okna ma obecnie przedstawiony kontroler modalny? Czy z powrotem przedstawi kontroler widoku modalnego? To, co dzieje się w naszej aplikacji, to to, że rootViewController jest przedstawiony, a nie modalny ...
Nava Carmon,
@Krumelur To jest w porządku. Mam wątpliwości. To znaczy, powiedzmy, że drugie okno interfejsu użytkownika jest wyświetlane nad wszystkimi bieżącymi widokami. Gdy użytkownik kliknie jeden przycisk na widoku, który jest w pierwszym oknie UIWindow, który przedstawia jeszcze jeden kontroler widoku. To drugie okno UIWindow by się ukryło. Jak sprawić, by to UIWindow było wyświetlane zawsze w całej aplikacji.
Easwaramoorthy K
1
Cały czas używam UIWindow do implementowania niestandardowych widoków alertów i wyskakujących okienek iPhone'a. Pomaga to zawsze wyświetlać widok pełnoekranowy, zawierający widok pełnoekranowy i osadzający inny widok „zawartości” wewnątrz, dzięki czemu widok zewnętrzny będzie wychwytywał wszelkie zdarzenia dotykowe (dzięki czemu mogę dodać ładny cień i przyciemnić moją inną zawartość ^^)
Martin Ullrich
3
Należy zauważyć, że drugie okno nie jest zachowywane tylko po to, aby było widoczne (w przeciwieństwie do zwykłych widoków zachowywanych przez ich superview).
Rivera
0

Oto Dokumentacja firmy Apple dla lepszego zrozumienia UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Jednym dobrym, choć konkretnym powodem korzystania z wielu wystąpień UIWindow jest nagranie wideo ekranu aplikacji. Możesz nie chcieć uwzględniać pewnych elementów (przycisk nagrywania, stan nagrywania itp.) W końcowym nagranym wideo, więc możesz umieścić te elementy w osobnym oknie UIWindow na górze.

W rzeczywistości, jeśli używasz ReplayKit, będziesz musiał użyć osobnego okna UIWindow dla tych wykluczonych elementów UI. Więcej informacji tutaj: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Ivy Xing
źródło