Orientação em um UIView adicionado a uma interface do usuário

Eu tenho um UIView que é suposto para cobrir todo o dispositivo (UIWindow) para suportar um efeito de zoom in / out de imagem que estou fazendo usando core animação onde um usuário toca um botão em um UITableViewCell e zoom da imagem associada.

O zoom está funcionando perfeitamente, o que não consegui descobrir é por que a subvisualização ainda está no modo retrato, embora o dispositivo esteja na paisagem. Uma ilustração abaixo:

insira a descrição da imagem aqui

Eu tenho um controlador de navegação, mas esta visão foi adicionada à interface do usuário diretamente.

    Você pode ler sobre algumas das possíveis causas aqui:
    Perguntas e Respostas Técnicas QA1688 – Por que meu UIViewController não roda com o dispositivo?

    Na sua situação, é provavelmente o fato de você estar adicionando a visualização como outra subvisualização da janela. Somente a primeira subvisualização recebe os events de rotação. O que você pode fazer é adicioná-lo como uma subvisualização da primeira subvisão da janela.

    UIWindow* window = [UIApplication sharedApplication].keyWindow; if (!window) window = [[UIApplication sharedApplication].windows objectAtIndex:0]; [[[window subviews] objectAtIndex:0] addSubview:myView]; 

    O problema

    A partir do iOS 6, apenas o controlador de visualização superior (ao lado do object UIApplication) participa da decisão de girar em resposta a uma alteração na orientação do dispositivo.

    https://developer.apple.com/library/content/qa/qa1688/_index.html

    A solução

    Eu abri um código aberto chamado AGWindowView .
    Ele lidará automaticamente com qualquer rotação e alteração de quadro, para que você não precise se preocupar com isso.

    O código

    Suporta qualquer combinação de versões do sistema SDK e iOS. O código relevante pode ser encontrado aqui: https://github.com/hfossli/AGWindowView/blob/master/Source/AGWindowView.m

    Eu criei uma categoria no UIApplication que tem uma propriedade auxiliar e um método para obter a primeira subvisualização da keyWindow. Esta é a visão que você deseja sobrepor de qualquer maneira. Agora, quando você adiciona uma exibição que é gerenciada por um UIViewController para essa exibição, o método shouldRotateToInterfaceOrientation: é chamado.

    UIApplication + WindowOverlay.h

     #import  @interface UIApplication(WindowOverlay) @property (nonatomic, readonly) UIView *baseWindowView; -(void)addWindowOverlay:(UIView *)view; @end 

    UIApplication + WindowOverlay.m

     #import "UIApplication+WindowOverlay.h" @implementation UIApplication(WindowOverlay) -(UIView *)baseWindowView{ if (self.keyWindow.subviews.count > 0){ return [self.keyWindow.subviews objectAtIndex:0]; } return nil; } -(void)addWindowOverlay:(UIView *)view{ [self.baseWindowView addSubview:view]; } @end 

    e aqui está como você usaria isto.

     //at the top of the file...or in {yourproject}.pch #import "UIApplication+WindowOverlay.h //in a method: UIView *view = [UIView new]; UIView *window = [UIApplication sharedApplication].baseWindowView; view.frame = window.bounds; [window addSubview:view]; //or [[UIApplication sharedApplication] addWindowOverlay:view]; 

    Isso porque, como você mencionou, sua visualização foi adicionada diretamente à UIWindow, portanto, quando o método para girar é chamado para o controlador de navegação, nada acontece com a exibição. O UIView rodaria se fosse uma subvisualização da vista do controlador de vista. Se por algum motivo isso não puder ser feito. Então você pode replace este método:

     // This method is called every time the device changes orientation - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations } 

    E toda vez que suas mudanças de orientação também mudam sua orientação de vista.

    Eu tive um problema semelhante com as visualizações sendo adicionadas diretamente a uma janela. Talvez isso ajude: Dimensionamento automático do UIView após adicionar à janela

    Outra solução como resolvi esse problema.

    Definir a orientação atual:

     @interface AJImageCollectionViewController (){ UIInterfaceOrientation _currentOrientation; } @end 

    Em seguida, verifique a orientação no viewWillLayoutSubviews:

     - (void)viewWillLayoutSubviews { [self checkIfOrientationChanged]; } - (void)checkIfOrientationChanged { UIInterfaceOrientation newOrientation = [[UIApplication sharedApplication] statusBarOrientation]; BOOL newOrientationIsPortrait = UIInterfaceOrientationIsPortrait(newOrientation); BOOL oldOrientationIsPortrait = UIInterfaceOrientationIsPortrait(_currentOrientation); // Check if the orientation is the same as the current if(newOrientationIsPortrait != oldOrientationIsPortrait){ _currentOrientation = newOrientation; // Do some stuff with the new orientation } }