Pergunta

Estou desenvolvendo um aplicativo para iPhone que tem várias pontas, e deve ser única paisagem.

A aplicação está definido para iniciar no modo paisagem, através do seu arquivo Info.plist.

Eu tenho dois controladores de vista: FirstViewController e SecondViewController.

Para cada um destes Eu tenho um arquivo nib, onde a vista é na paisagem. Ambos os controladores de vista são adicionados ao meu nib MainView como pontos de venda, e as suas opiniões são preguiçosamente inicializado.

Quando o aplicativo carrega, a primeira visão é exibido na paisagem, como esperado. No entanto, quando eu mudar para a segunda vista, o dispositivo (ou simulador) permanece na paisagem, mas a vista é girada, como se o aparelho estava no modo retrato, freando a minha interface.

Em ambas as classes UIViewController Eu tenho o seguinte código:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

e pontos de vista de comutação, em meu aplicativo delegar eu estou fazendo:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

onde viewController e secondViewController são as duas saídas, onde os controladores de vista estão ligados.

Isto é como o segundo ponto de vista olha no IB: alt texto http://img27.imageshack.us/img27/4898/picture1ni.png

e isso é o que parece no simulador: alt texto http://img402.imageshack.us/img402/4866/picture2wt.png

Por que é que a segunda visão está exibindo na paisagem, mas com a interface girado?

Eu não gostaria de lidar com propriedades de transformação, desde que parece um exagero.

Foi útil?

Solução

Eu estrelou essa pergunta esperando que alguém iria dar-lhe uma resposta esclarecedora e eu aprender alguma coisa .. infelizmente eu tenho medo que você pode precisar usar transformações para chegar a este trabalho corretamente. Aqui está o código que eu tenho usado ultimamente para resolver o problema:

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

Então, quando você está adicionando a sua nova visão, verifique a posição atual e se a força necessária a rotação:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

Então é claro que você vai querer responder adequadamente a shouldAutorotateToInterfaceOrientation em cada um de seus controladores de vista:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Eu adoraria ouvir sobre soluções alternativas, se isso não é tudo necessário. Há também uma ressalva tenho notado com esta configuração: se você tem uma transição entre pontos de vista, e você gira o telefone durante essa transição, é possível para os pontos de vista orientações para se capotou ou "preso" na orientação paisagem errado, tais que você precisa para ligar o telefone ao longo (paisagem com o botão direito vs paisagem-esquerda), como você navegar entre as visualizações.

Outras dicas

é apenas uma sugestão, mas você pode tentar retornar NO no método shouldAotorotate para a segunda vista. Ou tentar fazê-lo no modo retrato no IB. Parece que o seu ponto de vista foi carregado corretamente (no modo paisagem), mas, em seguida, recebeu a mensagem shouldAutorotate e tinha sido girada em 90 graus.

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