iOSマルチwindow statusbar rotation制御

3108 ワード

一、問題の発生


リリースが近づくと、同僚は突然私にstatusbarの回転の問題を見てもらいました.ホームページは縦画面だけをサポートしています(サブページがあるので横画面が必要です.だからappはportrait、landscapeLeft、landscapeRightの3つの方向をサポートする必要があります)、携帯電話の横縦画面ロックをカードして、携帯電話を回して、portraitのトップページだけをサポートするstatusbarの方向が意外にも回転しました.

二、問題の位置づけ


この問題を発見して、菊の花はきつくて、急いで1つのappstoreのオンラインバッグを降りて、発見は良いので、幸いです!オンラインは良くて、問題はきっと最近の修正が招いたので、以下は問題の位置づけの過程を記録します:1、工事plistを見て、すべて正常です.2,現在のpodfileとオンラインパッケージで使用されているpodfileを比較すると,各サブモジュールのアップグレードに加えて,新しいサブモジュールが1つしか導入されていないことが分かったが,名前から見ると,いくつかのデータ統計に関連するライブラリである.3,2の分析を経て、ある兄弟姉妹がモジュールをアップグレードしたとき、回転に関することをしたのではないかと推測し、釘群の中で@すべての人が、誰かが直したかどうかを聞いて、得られた戻りはNOで、これはおかしい.4,すべての人がこれを変更したことがないと言ったとき、私は疑問を持っていて、誰が変更したのかを見つけなければならないと思っていました.そこでdownからすべてのモジュールのコードを降りて、[UITIewController shouldAutoRotate]の記号ブレークポイントを追加して、時間の中でスタック出力を追加しました.残念ながら役に立つ情報は得られませんでした.記号ブレークポイントの実行時、po selfを実行して、結果はselfが定義していないことを教えてくれました.シンボルブレークポイントで呼び出し位置を特定しようとする方法が外れた.5,この时、1つの午前はすでに过ぎて、とても迷って、午后食事を终えて、各种のstatusbarの回転のcaseを探して、私と出会った现象はとても大きくて、心の中は焦って、英语でstackoverflowの上で検索して、多くwindowを言う时、回転に影响するかもしれませんと言って、これは私は可能だと思って、急いでコードの上でブレークポイントを打って、そして実行します:po[UIAPplication sharedApplication].Windows、実行しないで知らないで、実行してびっくりして、意外にも3つのwindowがあって、その中の1つは意外にもデータ統計の関連するライブラリのwindowで、考えて、多分このwindowの鍋で、podfileの中でこのライブラリを注釈して、注釈してこのライブラリを呼び出す方法を注釈して、再び運んで、すべて正常で、OK、これによって、問題に位置づけて、but why?

三、問題の分析


(二)では、問題点を見つけましたが、なぜこのような状況になったのか分かりませんが、この問題を明らかにするには、複数のwindowのdemoをして検証し、githubでmultiple UIWindowを検索し、demoを見つける必要があります.https://github.com/y310/MultiWindowSampleこのdemoで少し修正し、MWSViewControl、MWSSubWindowViewControlにメソッドを追加しました.
- (BOOL)shouldAutorotate{
    return NO;
}

Windowsを選択し、ビューも回転するにつれてstatusbar位置が正常になります.
次にマルチウィンドウを有効にします.MWSSubWindowViewControlでshouldAutorotateの戻り値をYESに変更し、showWindowボタンをクリックして携帯電話を回転すると、MWSSubWindowViewControlとstatusbarが回転しています.
それから、もう一度修正して、MWSViewControlのshouldAutorotateをYESに設定し、MWSSubWindowViewControlのshouldAutorotateをNOに設定し、showWindowボタンをクリックして携帯電話を回転すると、MWSSubWindowViewControlが回転していないのに、statusbarとMWSViewControlが回転し、ページが混乱しています.このとき、MWSSubWindowViewControlが半透明でなければ、MWSSubWindowViewControlに対してstatusbarが合わないことがわかります.
この時の現象は,我々が現れたstatusbar異常の問題を説明できるようになった.しかし、まだ少し違いがあります.私たちの可視windowは1つしかないので、変更する必要があります.MWSViewControlでshouldAutorotateをNOに変更します.OpenWindow:(id)senderメソッドを修正し、[self.window makeKeyAndVisible];すなわち、subwindowを表示させない.MWSSubWindowViewControlでshouldAutorotateをYESに戻し、プロジェクトを実行します.
- (IBAction)openWindow:(id)sender {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    MWSSubWindowViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SubWindow"];
    controller.window = self.window;
    self.window.rootViewController = controller;
//    [self.window makeKeyAndVisible];
}

MWSViewControllerのshow windowボタンをクリックするか、MWSViewControllerの上に留まるか、このときに携帯電話を回転させると、statusbarが内容と合わなくなり、問題が再現されます.

四、問題の知識点のまとめ


1,VC自身が回転するかどうかは,VC自身のshouldAutorotateメソッドによって決まる.2,statusbarが回転するかどうかは,すべてのマルチwindowのrootView ControlのshouldAutorotateが共同で決定する.