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 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:

Ao adicionar uma subvisualização, a visualização não é redimensionada se o aplicativo estiver no modo paisagem

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top