我的UIWindow
最初有白色背景。我想在设备旋转时将背景更改为蓝色(永久)。但实际发生的是颜色短暂闪烁蓝色然后又回到白色。
在app delegate中:
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
{
self.window.backgroundColor = [UIColor blueColor];
}
此代码按预期调用,但是当旋转结束时,-[UIWindow setBackgroundColor:]
第二次被调用(正如我通过子类UIWindow
发现的那样)。第二个调用的调用堆栈是:
-[UIWindow setBackgroundColor]
-[UIWindow _finishedFullRotation:finished:context:]
-[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
-[UIViewAnimationState animationDidStop:finished:]
-run_animation_callbacks
...
编辑(@ VinceBurn的答案)
应用程序只有一个视图(来自Xcode的基于视图的应用程序项目模板)。我现在已将视图的背景颜色(在IB中)设置为0%不透明度。仍然得到相同的结果。
为了确保白色不是来自其他一些默认颜色设置,我现在最初将窗口的背景颜色设置为绿色:
- (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;
}
旋转时,它会短暂闪烁蓝色但返回绿色。
答案 0 :(得分:5)
我最终做的是更改有效UIViewController
视图的背景颜色,而不是UIWindow
:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
self.view.backgroundColor = [UIColor blueColor];
}
我尝试设置UIWindow
的背景颜色的原因是为了在整个应用中获得相同的背景颜色。显然,实现这一目标的最简单方法是让应用程序中的所有UIViewController
继承自实现UIViewController
的{{1}}子类。
答案 1 :(得分:0)
这段代码好一点,但我还是希望别的。
- (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?
}
我的猜测是,在引擎盖下,方向是通过CAAnimation改变的,并且CAAnimation中设置的新属性不会粘在最后,所以你必须将它们设置在动画的旁边。