3

UINavigationControllerUIWindow の rootViewController として があり、縦向きのみをサポートする( ) が として に追加さUIViewControllerれます。ControllerAUINavigationControllerrootViewController

後で、UINavigationController's rootViewController新しい UIViewController ( ControllerB) に置き換えます。ControllerB は、ポートレートとランドスケープの両方をサポートします。ControllerA最初の画面 ( ) は縦向きでのみ機能し、アプリの残りの部分は縦向きと横向きの両方をサポートできるようにしたいと考えています。

[self.navigationController setViewControllers:@[viewControllerB] animated:NO];

| UINavigationController launches:
| ----ControllerA (rootViewController): Portrait only
| ----ControllerB (rootViewController): Portrait and Landscape supported

ControllerA で処理されない横向きでアプリを起動してから ControllerB に移動すると、コンテンツ (+ ステータス バー) は縦向きのままです。この時点でデバイスを手動で回転させると、正しいコンテンツ レイアウトになります。

デバイスの向きで ControllerB をレンダリングするにはどうすればよいですか?

ControllerA と ControllerB の両方の viewWillAppear メソッドから見たものは次のとおりです。

navigationController orientation: UIInterfaceOrientationPortrait 
UIViewController interfaceOrientation: UIInterfaceOrientationPortrait 

<!-----------!!two values are different!!------------------>
[[UIDevice currentDevice] orientation]: UIDeviceOrientationLandscapeLeft 
[[UIApplication sharedApplication] statusBarOrientation]: UIInterfaceOrientationPortrait 
Phone is physically held in Landscape at this point in time.
4

1 に答える 1

0

これが最も簡単な解決策 (iOS7 のみ) ですが、iOS5 まで拡張することができます。

独自の UINavigationController を記述 (またはカテゴリを記述) し、supportedInterfaceOrientations を実装するだけです。

@implementation MyNavigationController

- (NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}

@end

インターフェイスの向きを知りたい場合は、常に UIViewController.interfaceOrientation を使用してください。ステータスバーの向きが間違っている可能性があり (複数のウィンドウがある場合)、デバイスの向きは完全に間違っています。これは、デバイスが上向き (テーブルに平らに置かれている) である可能性があり、そこからインターフェイスの向きを推測できないためです。

于 2013-11-22T18:59:18.660 に答える