2011-12-06 4 views
3

私のUIWindowは、最初は白い背景になっています。私は、デバイスが回転しているときに背景を青色に(永久に)変更したいと思います。しかし、実際には、色が青く点滅してから白に戻ります。予想通りデバイスの回転時にUIWindowの背景色を変更します。

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

このコードは呼び出されますが、(私はUIWindowをサブクラス化することによって発見される)の回転が終了すると、-[UIWindow setBackgroundColor:]が二度目に呼び出されたときに:

アプリデリゲートで

。 2回目の呼び出しのためのコールスタックは、次のとおりです。(@ VinceBurnの答えのため)

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

編集

アプリケーションは、(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

最初にどこに白い背景を設定しましたか? –

+0

@ケイ - 詳細を教えてください。 – jlstrecker

+0

@VinceBurn - どこでも設定しないようにしました(白がデフォルトです)。そして、私は '-application:didFinishLaunchingWithOptions:'で設定しようとしました。どちらの方法でも同じ結果が得られます。 – jlstrecker

答えて

5

ではなくUIWindowの、アクティブUIViewControllerのビューの背景色を変更することでした:

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

理由私はUIWindowの背景色を設定しようとしていたましたアプリ全体で同じ背景色を得ることができます。どうやらそれを達成する最も簡単な方法は、UIViewControllerのすべてがを実装するUIViewControllerサブクラスから継承することです。

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の新しいプロパティセットが最後に固執していないということです。私がやってしまった何を

+0

私の編集をご覧ください。 – jlstrecker

+0

@jlstreckerそれはとても興味深いので、私はそれを試しました。そして、私はそれを修正することはできません。私は変更オリエンテーションのためのNSNotificationに登録しようとしました、それはそれがアプリケーションデリゲートよりも遅くコールすると書かれているドキュメントです。しかし同じ結果... –

+0

あなたのソリューションをいくつかのデバイスで試してみました(ポートレートでは緑色、景色では青色に変わります)。デバイスの 'duration'に追加する時間は、0.2または0.25に似ています。結局のところ、理想的な時間は、デバイスだけでなく、あなたが回転している方向(風景と肖像)と、あなたが以前に何回回転したかによっても決まります!時間が短すぎると色が変わらず、長すぎると回転後に色がちらつきます。私は他のいくつかの回避策を試してみるつもりです。もし私があなたのものを使ってしまったら、答えとしてマークします。 – jlstrecker

関連する問題