Vantagens, problemas, exemplos de adição de outra UIWindow a um aplicativo iOS?

92

Recentemente, tenho me perguntado sobre o fato de um aplicativo iOS ter apenas um UIWindow. Não parece ser um problema criar outro UIWindowe colocá-lo na tela.

Minha pergunta é meio vaga, mas estou interessado em:

  • O que eu poderia potencialmente alcançar com um segundo UIWindowque não pode ser feito de outras maneiras?
  • O que pode dar errado ao usar várias UIWindowinstâncias?
  • Eu vi que as pessoas usam um segundo UIWindowpara exibir popover como visualizações no iPhone. Esta é uma boa maneira de fazer isso? Por quê? Por que não?
  • Existem outros exemplos em que faz todo o sentido ter outro UIWindow?

Não é que esteja faltando alguma coisa. Nunca senti a necessidade de criar outra UIWindowinstância, mas talvez isso permitisse fazer coisas incríveis das quais não tenho conhecimento! :-)

Espero que isso possa me ajudar a resolver este problema: preciso adicionar uma "visualização da capa" sobre o que está sendo exibido no momento. Também deve funcionar se já houver um ou mais controladores modais apresentados. Se eu adicionar a UIViewà visualização do controlador raiz, os controladores modais ficam no topo, assim como os controladores popover. Se eu apresentar a visualização da capa modalmente e já houver um controlador modal, apenas parte da tela será coberta.

Krumelur
fonte
Usando várias UIWindows em aplicativos iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Respostas:

26

A UIWindowpode flutuar acima de outros elementos da IU, como o teclado do sistema.

Para tratar do seu último parágrafo: Faça um UIWindowcom a mesma moldura da janela principal. Defina sua windowLevelpropriedade como UIWindowLevelStatusBar. Defina sua hiddenpropriedade como NO.

rob mayoff
fonte
Err, certo. Obrigado. Eu sabia. Você pode detalhar um pouco as minhas perguntas? Você sabe como obter RID de um segundo UIWindow que foi adicionado por makeKeyAndVisible?
Krumelur
Defina a propriedade oculta da segunda UIWindow como YES.
rob mayoff
Obrigado. E eu mostro a janela tornando-a visível e visível? E eu escondo fazendo OUTRA janela visível e apenas descartando a outra? Como posso animar uma UIWindow como UIActionSheet faz?
Krumelur
Cuidado com isso. Se em! = UIWindowLevelNormal, o teclado aparecerá abaixo dele no <iOS7.
Shawn
108

Começando com a resposta de Rob, brinquei um pouco e gostaria de escrever algumas notas para outros que tentam obter informações sobre este tópico:

  • Não é um problema adicionar outro UIWindow. Basta criar um e makeKeyAndVisible. Feito.
  • Remova-o tornando outra janela visível e, em seguida, libere a que você não precisa mais.
  • A janela que é "chave" recebe todas as entradas do teclado.
  • UIWindow cobre tudo, até modais, popovers, etc. Brilhante!
  • UIWindowé sempre retrato implicitamente. Não gira. Você terá que adicionar um controlador como o controlador raiz da nova janela e deixar que a rotação do manipulador. (Assim como a janela principal)
  • O nível da janela determina o quão "alto" ela será exibida. Defina como para UIWindowLevelStatusBarque cubra tudo. Defina sua hiddenpropriedade como NÃO.
  • Um segundo UIWindowpode ser usado para trazer visualizações na tela que flutuam em cima de tudo. Sem criar um controlador fictício apenas para incorporá-lo a um UIPopoverController.
  • Pode ser especialmente útil no iPhone, onde não há controlador popover, mas você pode querer imitar algo parecido.
  • E sim, isso resolveu meu problema, é claro: se o aplicativo desistir da ativação, adicione uma janela de cobertura sobre o que estiver sendo mostrado no momento para evitar que o iOS faça uma captura de tela do conteúdo atual do seu aplicativo.
Krumelur
fonte
Eu não teria coragem de usar outra UIWindow se não fosse pela sua resposta. Isso também foi extremamente útil porque a segunda UIWindow não girava automaticamente por conta própria.
Dan Abramov de
1
Postagem muito esclarecedora. Mas o que acontece se você renunciar a esta janela e tornar a chave da janela subjacente visível e o rootViewController desta janela subjacente tiver um controlador modal atualmente apresentado? Ele apresentará o controlador de visualização modal de volta? O que acontece em nossa aplicação é que rootViewController é apresentado não modal ...
Nava Carmon
@Krumelur Isso é bom. Tenho uma dúvida. É, digamos que a 2ª UIWindow seja exibida no topo de todas as visualizações atuais. Quando o usuário clica em um botão na view que está na 1ª UIWindow que está apresentando mais um viewcontroller. Esta segunda UIWindow iria se esconder. Como fazer com que esta UIWindow seja exibida sempre em todo o aplicativo.
Easwaramoorthy K
1
Eu uso UIWindow o tempo todo para implementar visualizações de alerta com estilo personalizado e popovers de iphone. Isso sempre ajuda a tornar a visualização em tela cheia, contendo uma visualização em tela cheia e incorporando outra visualização de "conteúdo" dentro de modo que a visualização externa capture quaisquer eventos de toque (e assim eu possa adicionar uma bela sombra e escurecer meu outro conteúdo ^^)
Martin Ullrich
3
Deve-se notar que uma segunda janela não é mantida apenas para ser visível (em contraste com as vistas regulares sendo mantidas por sua visão panorâmica).
Rivera
0

Aqui está a documentação da Apple para entender melhor a UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Um bom motivo, embora específico, para usar várias instâncias de UIWindow é quando você precisa gravar a tela do aplicativo em vídeo. Você pode não querer incluir certos elementos (botão de gravação, status de gravação, etc.) no vídeo final gravado, então você pode colocar esses elementos em uma UIWindow separada no topo.

Na verdade, se você estiver usando o ReplayKit, terá que usar uma UIWindow separada para esses elementos de UI excluídos. Mais informações aqui: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Ivy Xing
fonte