Visualizar posicionado incorretamente quando definido no modo de paisagem
-
21-09-2019 - |
Pergunta
Meu aplicativo para iPhone é baseado em navegação e contém muitas visualizações somente para retratos e uma visão apenas para visualização de imagens. Então, eu gostaria de forçar essa vista apenas para cenário para girar automaticamente para Lanscape, mesmo que o dispositivo esteja posicionado no modo retrato.
Então, aqui está o que eu fiz no controlador dessa visão:
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
- (void)viewWillAppear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlackTranslucent];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
_originalTransform = [[appDelegate navigationController].view transform];
_originalBounds = [[appDelegate navigationController].view bounds];
_originalCenter = [[appDelegate navigationController].view center];
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
landscapeTransform = CGAffineTransformTranslate (landscapeTransform, +80.0, +100.0);
[[appDelegate navigationController].view setTransform:landscapeTransform];
[appDelegate navigationController].view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[appDelegate navigationController].view.bounds = CGRectMake(0.0, 0.0, 480.0, 320.0);
[appDelegate navigationController].view.center = CGPointMake (240.0, 160.0);
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
[self.navigationController.navigationBar setBarStyle:UIBarStyleDefault];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[appDelegate navigationController].view setTransform:_originalTransform];
[[appDelegate navigationController].view setBounds:_originalBounds];
[[appDelegate navigationController].view setCenter:_originalCenter];
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}
Agora eu tenho essa visão sempre mostrada no modo Lanscape. Mas há um problema. Esta visão está posicionada incorretamente como mostrado em Esta captura de tela.
Tentei definir manualmente o quadro após a rotação, mas não ajudou. Além disso, não encontrei um guia completo como definir uma visão para ser apenas para paisagem. Por favor ajude-me com este problema.
Solução
Confira esse cara publicar. Basicamente, você precisa se transformar ao redor do centro da janela. Parece que você também pode precisar girar a barra de status.
Um método diferente seria usar o Uidevice SetDeviceIentation, mas essa é uma API privada e, portanto, não é uma ótima solução.
Outras dicas
Tente usar este método depois de aplicar a transformação:
[self.view sizeToFit];