Eu tenho um UIPopoverController hospedando um UINavigationController, que contém uma pequena hierarquia de controladores de exibição.
Eu segui os documentos e para cada controlador de visualização, eu defini o tamanho do contexto popover da visualização assim:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
(tamanho diferente para cada controlador)
Isso funciona conforme o esperado conforme eu navego para frente na hierarquia - o popover anima automaticamente as mudanças de tamanho para corresponder ao controlador enviado.
No entanto, quando navego "Voltar" pela pilha de visualização por meio do botão Voltar da barra de navegação, o popover não muda de tamanho - permanece tão grande quanto a visualização mais profunda alcançada. Isso parece quebrado para mim; Eu esperaria que o popover respeitasse os tamanhos que são configurados conforme ele aparece na pilha de exibição.
Estou esquecendo de algo?
Obrigado.
viewWillAppear:
)?Respostas:
Ok, eu estava lutando com o mesmo problema. Nenhuma das soluções acima funcionou muito bem para mim, por isso decidi fazer uma pequena investigação e descobrir como isso funciona. Isto é o que descobri: - Quando você define o
contentSizeForViewInPopover
em seu controlador de visualização, ele não será alterado pelo próprio popover - embora o tamanho do popover possa ser alterado durante a navegação para um controlador diferente. - Quando o tamanho do popover muda durante a navegação para um controlador diferente, ao voltar, o tamanho do popover não é restaurado - Alterar o tamanho do popover em viewWillAppear dá uma animação muito estranha (digamos que você popController dentro do popover) - Eu não o recomendaria - Para mim, definir o tamanho do código dentro do controlador não funcionaria de jeito nenhum - meus controladores às vezes têm que ser grandes, às vezes pequenos - o controlador que irá apresentá-los tem uma ideia sobre o tamanho emboraUma solução para toda essa dor é a seguinte: Você deve redefinir o tamanho de
currentSetSizeForPopover
em viewDidAppear. Mas você tem que ter cuidado, quando você definir o mesmo tamanho que já estava definido no campocurrentSetSizeForPopover
, o popover não mudará o tamanho. Para que isso aconteça, você pode primeiro definir o tamanho falso (que será diferente do que foi definido antes), seguido de definir o tamanho adequado. Esta solução funcionará mesmo se o seu controlador estiver aninhado dentro do controlador de navegação e o popover mudará seu tamanho de acordo quando você navegar de volta entre os controladores.Você poderia criar facilmente uma categoria em UIViewController com o seguinte método auxiliar que resolveria a configuração do tamanho:
Em seguida, basta invocá-lo
-viewDidAppear
do controlador desejado.fonte
Veja como resolvi isso para iOS 7 e 8:
No iOS 8, o iOS está silenciosamente envolvendo a visualização que você deseja no popover no PresentViewController do controlador de visualização apresentandoViewController. Há um vídeo WWDC de 2014 explicando o que há de novo no popovercontroller, onde eles tocam nisso.
De qualquer forma, para controladores de visualização apresentados na pilha de controladores de navegação que desejam seu próprio dimensionamento, esses controladores de visualização precisam (no iOS 8) chamar este código para definir dinamicamente o preferredContentSize:
Substitua heightOfTable por sua tabela computada ou altura de visualização.
Para evitar muitos códigos duplicados e criar uma solução comum iOS 7 e iOS 8, criei uma categoria em UITableViewController para realizar este trabalho quando viewDidAppear é chamado em minhas tableviews:
Categoria.h:
Category.m:
fonte
presentingViewController
obras. Se eu definir opreferredContentSize
em,viewDidLoad
haverá um comportamento estranho: navegar de volta a partir de outro controlador de visualização no popover leva a uma alteração incorreta no tamanho do popover. Parece que o tamanho zero do popover foi definido, mas o tamanho está correto. Nesse caso, o popover ocupa toda a altura da tela. Você sabe talvez por que esse é o caso? Não tenho a restrição com 600 pontos implementados porque na minha experiência o sistema operacional não permite especificar um tamanho maior do que o tamanho da tela.viewDidLoad
...Esta é uma melhoria na resposta de krasnyk .
Sua solução é ótima, mas não é animada sem problemas.
Uma pequena melhoria fornece uma boa animação:
Remova a última linha do
- (void) forcePopoverSize
método:Coloque [self forcePopoverSize] no
- (void)viewWillAppear:(BOOL)animated
método:E finalmente - defina o tamanho desejado no
- (void)viewDidAppear:(BOOL)animated
método:fonte
Você precisa definir o tamanho do conteúdo novamente em
viewWillAppear
. Chamando o método delagate no qual você define o tamanho do popovercontroller. Eu também tive o mesmo problema. Mas quando adicionei isso o problema foi resolvido.Mais uma coisa: se você estiver usando versões beta menores que 5. Então, os popovers são mais difíceis de gerenciar. Eles parecem ser mais amigáveis a partir da versão beta 5. É bom que a versão final tenha sido lançada. ;)Espero que isto ajude.
fonte
viewWillAppear
não funcionou para mim. Definir o tamanho do popover explicitamente funcionou, mas isso é gueto.Em
-(void)viewDidLoad
de todos os controladores de visualização que você está usando no controlador de navegação, adicione:fonte
Eu redefino o tamanho no viewWillDisappear: (BOOL) método animado do controlador de visualização que está sendo navegado de volta:
Então, quando a visualização que está sendo navegada de volta aparece, eu redefino o tamanho de maneira apropriada:
fonte
Para iOS 8, funciona o seguinte:
BTW, eu acho, isso deve ser compatível com as versões anteriores do iOS ...
fonte
willTransitionToTraitCollection
, noanimateAlongsideTransition
bloco de conclusão.fonte
Para mim, essa solução funciona. Este é um método do meu controlador de visualização que estende UITableViewController e é o controlador raiz para UINavigationController.
E não se esqueça de definir o tamanho do conteúdo para o controlador de visualização que você vai colocar na pilha de navegação
fonte
se você pode imaginar o assambler, acho que é um pouco melhor:
fonte
CGSizeZero
vez de fazer você mesmo emCGSizeMake(0,0)
A resposta aceita não está funcionando bem com o iOS 8. O que eu fiz foi criar minha própria subclasse de
UINavigationController
para uso naquele popover e substituir o métodopreferredContentSize
desta maneira:Além disso, em vez de chamar
forcePopoverSize
(método implementado por @krasnyk) emviewDidAppear
, decidi definir um viewController (que mostra o popover) como um delegado para a navegação mencionada anteriormente (no popover) e fazer (o que o método force faz) em:método delegado para um aprovado
viewController
. Uma coisa importante, fazerforcePopoverSize
em umUINavigationControllerDelegate
método é bom se você não precisa que a animação seja suave, então deixe-a ativadaviewDidAppear
.fonte
Eu estava enfrentando o mesmo problema, mas você não deseja definir o tamanho do conteúdo no método viewWillAppear ou viewWillDisappear.
defina a propriedade contentSizeForViewInPopover para esse controlador antes de enviar esse controlador para navigationController
fonte
Tive sorte colocando o seguinte em viewdidappear:
Embora isso possa não ter uma boa animação no caso de você empurrar / abrir popovers de tamanhos diferentes. Mas no meu caso, funciona perfeitamente!
fonte
Tudo o que você precisa fazer é:
- No método viewWillAppear do popOvers contentView, adicione o trecho fornecido abaixo. Você terá que especificar o tamanho do popOver na primeira vez que for carregado.
fonte
Tive esse problema com um controlador de popover cujo popoverContentSize = CGSizeMake (320, 600) no início, mas ficaria maior ao navegar por seu ContentViewController (um UINavigationController).
O controlador de navegação estava apenas empurrando e popping UITableViewControllers personalizados, portanto, em viewDidLoad da minha classe de controlador de visualização de tabela personalizada, configurei self.contentSizeForViewInPopover = CGSizeMake (320, 556)
Os 44 pixels a menos são responsáveis pela barra de navegação do controlador de Nav, e agora não tenho mais problemas.
fonte
Coloque isso em todos os controladores de visualização que você está empurrando dentro do popover
fonte
Enfrentou o mesmo problema e o corrigiu definindo o tamanho da visualização do conteúdo para o controlador de navegação e o controlador de visualização antes que o init do UIPopoverController fosse colocado.
fonte
Só gostaria de oferecer outra solução, pois nenhuma delas funcionou para mim ...
Na verdade, estou usando com este https://github.com/nicolaschengdev/WYPopoverController
Quando você chamar seu pop-up pela primeira vez, use-o.
Então, nesse pop-up, use isso.
Em seguida, repita para visualizações filhas ...
fonte
Esta é a maneira correta no iOS7 de fazer isso. Defina o tamanho do conteúdo preferido em viewDidLoad em cada controlador de visualização na pilha de navegação (feito apenas uma vez). Então, em viewWillAppear, obtenha uma referência ao controlador popover e atualize o contentSize lá.
fonte
A solução @krasnyk funcionou bem nas versões anteriores do iOS, mas não funcionou no iOS8. A solução a seguir funcionou para mim.
Não é a melhor solução, mas funciona.
O novo UIPopoverPresentationController também tem o problema de redimensionamento :(.
fonte
Você precisa definir a
preferredContentSize
propriedade do NavigationController emviewWillAppear
:fonte