これは多くの人を悩ませてきたものであることがわかります:/
UINavigationControllerタイプの4つのviewControllerを持つUITabBarControllerがあります。NavigationControllerの1つがviewControllerをスタックにプッシュします。このviewControllerは横向きモード/向きで表示する必要があります。
viewControllerはグラフであり、横向きが理にかなっているアプリ内で絶対に唯一の場所です。(これが表示されたときにUITabBarを非表示にして、これがどこでも機能するとユーザーに思わせないようにします)
UITabBarControllerが方向の変更に正しく応答するようにするには、そのすべてのviewControllerがデリゲートメソッドから同じ値を返す必要があります。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
したがって、この動作に対応するために、UITabBarControllerに属するすべてのviewControllerにこのメソッドを実装しました。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL canRotate = [defaults boolForKey:@"can_rotate"];
return canRotate;
}
「トリック」とは、ランドスケープになり得るviewControllerがプッシュされたときに、次のことを行うことです。
- (void) viewWillAppear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"can_rotate"];
[defaults synchronize];
}
そしてそれがポップされたとき、私はこれを行います:
- (void) viewWillDisappear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"can_rotate"];
[defaults synchronize];
}
これは本当にうまくいきます。viewControllerがスタック上にある場合、デバイスを回転させることができ、ビューが続きます。
ただし、問題は、ユーザーが横向きモードでナビゲーションバーの「戻る」ボタンをタップして、viewControllerを前のviewControllerにポップした場合、この「古い」viewControllerももちろん横向きモードになることです。さらに悪いことに、BOOLをNOに設定したため、デバイスを縦向きモードにすると、この「古い」viewControllerは回転して戻ることができません。
横向きモードのviewControllerをポップしたときに、他のviewControllerが横向きモードにならないようにすべてを更新する方法はありますか?
これが横向きから横向きにできるのであれば、縦向きから横向きにもできるはずなので、私の「ハック」は不要になるのではないかと少し心配しています。しかし、それができない場合は、正方形に戻ります:/
私が近くにいて、誰かが私がそこに着くのを手伝ってくれることを願っています、ありがとう:)