13

いくつかのビュー コントローラーを持つナビゲーション コントローラーがあります。横向きのみをサポートする 1 つの特別なビュー コントローラーを除いて、すべてのビュー コントローラーのすべての向きをサポートする必要があります。この特別なビュー コントローラーは、ナビゲーション スタックの中央に表示されます。私はかなり多くの調査を行いましたが、良い解決策を見つけることができませんでした。ここに私が読んで試したリンクがあります。

http://www.iphonedevsdk.com/forum/iphone-sdk-development/3219-force-landscape-mode-one-view.html#post60435

画面を横向きに回転するには?

縦向きモードから横向きモードに自動回転する方法は? iPhone - ビューコントローラー 1 つだけで横向きを許可 http://goodliffe.blogspot.com/2009/12/iphone-forcing-uiview-to-reorientate.html

presentModalViewController次に、特別なView Controllerを表示するために、Navigation Controllerを置き換えてみます。次に、特別なビュー コントローラー内に新しいナビゲーション ビュー コントローラーを作成して、後続のビュー コントローラーをプッシュします。

誰かがより良いアイデアを持っている場合は、私に知らせてください。本当に感謝!

更新:上記の方法を正常に使用しました:新しいナビゲーションコントローラーに置き換えpushViewControllerて作成します。presentModalViewController

4

5 に答える 5

9

ナビゲーション コントローラー スタックにプッシュされるすべてのビュー コントローラーは、同じ向きをサポートする必要があります。これは、一部のビュー コントローラーが縦向きのみをサポートし、他のビュー コントローラーが横向きのみをサポートすることはできないことを意味します。つまり、同じナビゲーション コントローラー スタック上のすべてのビュー コントローラーは、デリゲートで同じものを返す必要があります。

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

しかし、これには簡単な解決策があります!これは、縦向きから横向きにする例です。これを行う手順は次のとおりです。以下はそれをサポートするコードです。

  1. サブ ナビゲーション コントローラーのルートになる「偽の」ビュー コントローラーを作成します。このView Controllerは横向きをサポートする必要があります。
  2. の新しいインスタンスを作成しUINavigationController、「偽の」ビュー コントローラーのインスタンスをルートとして追加し、ランドスケープ ビュー コントローラーのインスタンスを 2 番目のビュー コントローラーとして追加します。
  3. UINavigationController親View Controllerからインスタンスをモーダルとして提示する

まず、次のコードで新しいビュー コントローラー (FakeRootViewController) を作成します。

@interface FakeRootViewController : UIViewController
@property (strong, nonatomic) UINavigationController* parentNavigationController;
@end

@implementation FaceRootViewController
@synthesize parentNavigationController;
// viewWillAppear is called when we touch the back button on the navigation bar
(void)viewWillAppear:(BOOL)animated {
  // Remove our self from modal view though the parent view controller
  [parentNavigationController dismissModalViewControllerAnimated:YES];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
} 

横向きモードで表示したいView Controllerを表示するコードは次のとおりです。

FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton]; // Set back button
// The parent navigation controller is the one containing the view controllers in portrait mode.
fakeRootViewController.parentNavigationController = parentNavigationController;

UINavigationController* subNavigationController = // Initialize this the same way you have initialized your parent navigation controller.

UIViewController* landscapeViewController = // Initialize the landscape view controller

[subNavigationController setViewControllers:
   [NSArray arrayWithObjects:fakeRootViewController, 
                                               landscapeViewController, nil] animated:NO];

[_navigationController presentModalViewController:subNavigationController animated:YES];

landscapeViewController にもこの実装が必要であることに注意してください。

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
} 
于 2012-06-09T06:11:41.027 に答える
1

方向の変更を強制するためのプライベート API があります。プッシュされたView Controllerに入れます-viewWillAppear:

if ([UIDevice instancesRespondToSelector:@selector(setOrientation:)]) {
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
}

コンパイラの警告を抑制するには、これをビュー コントローラーの .m ファイルに追加します。

@interface UIDevice()
- (void)setOrientation:(UIDeviceOrientation)orientation; // private API to let POIEntryVC be pushed over landscape route view
@end

いつものように、プライベート API を使用すると、拒否されるリスクと将来の OS バージョンで壊れるリスクがあります。ご自身の責任で行ってください。

一般に、ほとんどの場合、モーダル ビュー コントローラーを提示する方が適切なソリューションです。

于 2012-12-10T12:45:10.763 に答える
0

このコードを試してUINavigationController、現在表示されているビューのshouldAutorotateToInterfaceOrientation. 私の場合、私は を持ってUINavigationControllerUITabBarControllerますが、おそらく他のケースに適応させることができます。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([appDelegate.tabBarController.selectedViewController respondsToSelector:@selector(topViewController)])
    {
        UINavigationController *nc = (UINavigationController*)appDelegate.tabBarController.selectedViewController;
        return [nc.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
于 2011-04-14T23:11:53.557 に答える
0

アクションを実行できます: schellsan の提案に従ってコードを変更します。次に、currentViewController (ナビゲーション viewController にプッシュされます) をプロパティとして appDelegate に追加してみてください。View Controllerをプッシュしようとすると、この前に現在のView Controllerに設定します。次に、ナビゲーション コントローラーで rootViewController のサブクラスを作成します。このサブクラスの owerload メソッドで

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return [appDelegate.currentViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

ナビゲーションバーを使用せず、古いコントローラーをポップした後に新しいコントローラーを押すと機能するはずです

于 2011-09-23T06:55:13.137 に答える
0

実装するのと同じくらい簡単でなければなりません

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

それぞれUIViewControllerにプッシュされますUINavigationController。その特定の特定の方向に対してUIViewController、ビューが回転してはならない場合。ただし、実装する場合は、ここに落とし穴がありますreturn NOUIViewControllerUINavigationController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

そのviewControllersがそのメソッドを受け取るのをブロックします。その場合、メッセージを topViewController に転送する必要があります。

[[self topViewController] shouldAutorotateToInterfaceOrientation:interfaceOrientation];
于 2011-02-17T02:25:31.353 に答える