Изменить цвет фона UIWindow при вращении устройства - PullRequest
3 голосов
/ 06 декабря 2011

Мой UIWindow изначально имеет белый фон. Я хочу изменить фон на синий (постоянно), когда устройство вращается. Но на самом деле цвет кратковременно мигает синим, а затем возвращается к белому.

В приложении делегат:

- (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 ]

5 голосов
/ 09 декабря 2011

В итоге я изменил цвет фона для активного UIViewController представления вместо UIWindow:

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

. Причина, по которой я пытался установить фонцвет UIWindow должен был получить одинаковый цвет фона во всем приложении.По-видимому, самый простой способ сделать это состоит в том, чтобы все UIViewController в приложении наследовали от подкласса UIViewController, который реализует -didRotateFromInterfaceOrientation:.

0 голосов
/ 06 декабря 2011

Этот код немного лучше, но я все еще надеюсь на что-то еще.

- (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 не держится в конце, поэтому вы должны установить их также вне анимации.

...