UIView addsubview após mudança de orientação:Diga à visualização para redimensionar
-
13-11-2019 - |
Pergunta
Eu tenho um UIView como XIB no modo Retrato.
Esta visão é adicionada programaticamente ao viewcontroller assim:
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
Esta visualização possui máscaras de redimensionamento automático configuradas corretamente e gira perfeitamente quando a orientação muda de Retrato para Paisagem.
Contudo, se a orientação for já paisagem e eu crio a vista depois a orientação muda, ele tem sua orientação inicial de retrato.
Existe uma maneira de dizer à visualização para inicializar ou redimensionar para retrato usando suas máscaras?
Agradecemos antecipadamente por qualquer resposta!
EDITAR:Usando as sugestões de occulus e Inder Kumar Rathore (obrigado pessoal!), alterei o código para isto:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];
Infelizmente, não há nenhuma mudança.Acho que encontrei alguém fazendo a mesma pergunta:
A resposta identifica o problema corretamente, mas não é muito encorajadora...Claro, eu poderia criar duas pontas ou redimensionar o quadro, mas isso parece contrário à ideia de redimensionamento automático.Acho difícil acreditar que não há como saber uma ponta depois de acordar e adicioná-la a uma visualização para usar seus recursos de redimensionamento automático...algo que funciona perfeitamente quando o dispositivo gira.
EDITAR 2:
A solução do idz funciona:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
Obrigado!
Solução
Muitas vezes um arquivo NIB/XIB contém um UIViewController
que cuida de tudo isso.Neste caso, como não há controlador de visualização (no NIB/XIB), você precisa assumir suas funções de pós-carregamento.
Chamando layoutSubviews
direta ou indiretamente através setNeedsLayout
ou layoutIfNeeded
não vai adiantar muito porque a implementação padrão não faz nada.
Supondo que você queira que a visualização de entrada preencha os limites de self.view, faça o seguinte:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
Todas as máscaras de redimensionamento das subvisualizações deve esteja configurado corretamente para que isso funcione e, obviamente, se você não quiser preencher todos os limites, você pode querer ajustar o quadro.
Outras dicas
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];
Isso funciona para mim (Y)
Não sei se você ainda tem esse problema.
Digamos que você tenha a seguinte arquitetura:
- janela
- controlador de subview
(você implementou o deveriaautorotate correto para responder às orientações desejadas)
Neste subviewcontroller você deseja adicionar as visualizações de novos UIViewControllers apenas chamando o addSubview
função.
Em vez de implementar a manipulação de limites em shouldautorotate, você deve implementá-la em
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
self.newUIViewController.view.frame = self.view.bounds;
}
didRotateFromInterface
...é chamado depois shouldRotate
.Nesta função os limites já estão configurados corretamente.
Dessa forma você não precisa de tanta manipulação por código.
Veja esta pergunta relacionada:
Quando as máscaras de redimensionamento automático entram em vigor no iOS?
Então, depois de carregar sua nova visualização a partir da ponta e adicioná-la como uma subvisualização self.view
, tente ligar setNeedsLayout
.