设备旋转时更改UIWindow背景颜色

时间:2011-12-06 17:13:25

标签: iphone ios ipad uiviewanimation uiwindow

我的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;
}

旋转时,它会短暂闪烁蓝色但返回绿色。

2 个答案:

答案 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中设置的新属性不会粘在最后,所以你必须将它们设置在动画的旁边。