Pergunta

Meu UIWindow inicialmente tem um fundo branco. Quero alterar o fundo para azul (permanentemente) quando o dispositivo girar. Mas o que realmente acontece é que a cor pisca brevemente em azul e depois volta ao branco.

No delegado do aplicativo:

- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
{
    self.window.backgroundColor = [UIColor blueColor];
}

Este código é chamado conforme o esperado, mas quando a rotação termina, -[UIWindow setBackgroundColor:] é chamado uma segunda vez (como descobri criando uma subclasse de UIWindow). A pilha de chamadas para a segunda chamada é:

-[UIWindow setBackgroundColor]
-[UIWindow _finishedFullRotation:finished:context:]
-[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
-[UIViewAnimationState animationDidStop:finished:]
-run_animation_callbacks
...

Editar (para a resposta de @VinceBurn)

O aplicativo tem exatamente uma visualização (do modelo de projeto de aplicativo baseado em visualização do Xcode). Agora defini a cor de fundo da visualização (em IB) para 0% de opacidade. Ainda obtendo os mesmos resultados.

Para garantir que a cor branca não seja proveniente de alguma outra configuração de cor padrão, estou inicialmente configurando a cor de fundo da janela para verde:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    self.window.backgroundColor = [UIColor greenColor];
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

Quando gira, ele pisca brevemente em azul, mas retorna ao verde.

Foi útil?

Solução

O que acabei fazendo foi mudar a cor de fundo da visualização do UIViewController ativo, em vez do UIWindow:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    self.view.backgroundColor = [UIColor blueColor];
}

O motivo pelo qual tentei definir a cor de fundo do UIWindow foi para obter a mesma cor de fundo em todo o aplicativo.Aparentemente, a maneira mais simples de fazer isso é fazer com que todos os UIViewControllers no aplicativo sejam herdados de uma subclasse UIViewController que implementa -didRotateFromInterfaceOrientation:.

Outras dicas

Este código é um pouco melhor, mas ainda espero por outra coisa.

- (void)changeColor 
{
  self.window.backgroundColor = [UIColor orangeColor];
}
- (void)application:(UIApplication *)application 
willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation 
                      duration:(NSTimeInterval)duration
{
  //  At first set it to the color
  self.window.backgroundColor = [UIColor orangeColor];
  // And make it change again when the animation is finished
  [self performSelector:@selector(changeColor) 
             withObject:self 
             afterDelay:duration + 0.005];
      //  You may have to play with the add part of the duration this was working 
          in the simulator, but on device?
}

Meu palpite é que, por baixo do capô, a orientação é alterada por meio de um CAAnimation, e a nova propriedade definida em um CAAnimation não se fixa no final, então você deve defini-los também fora da animação.

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