Alterar a cor de fundo da UIWindow quando o dispositivo gira
-
28-10-2019 - |
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.
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 UIViewController
s 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.