Paisagem única iPhone app com vários nibs
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.
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.