13

したがって、次の階層があります。

UINavigationController-- > RootViewController ( UIViewController) --> UITableViewController--> DetailViewController ( UIViewController)

RootViewController の向きをポートレートのみにロックしたいのですが、残りのビュー コントローラーの向きはすべて残します。

これを subclassed にするとUINavigationController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

その後、すべてのビュー コントローラーが縦向きにロックされます。

私の質問は、RootViewController のみを Portrait にロックし、他のビュー コントローラーのすべてのオプションを残す方法はありますか?

4

5 に答える 5

27

iOS 6 での自動回転の修正については、こちらのリンクを確認し、ビュー単位で向きのサポートを設定してください: http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/

これがあなたができることです:

  1. のサブクラスであるカスタム ナビゲーション コントローラーをUINavigationController.m ファイルに作成します。

     - (BOOL)shouldAutorotate
     {
          return self.topViewController.shouldAutorotate;
     }
     - (NSUInteger)supportedInterfaceOrientations
     {
          return self.topViewController.supportedInterfaceOrientations;
     }
    
  2. あなたのAppDelegate.h

      @interface AppDelegate : UIResponder <UIApplicationDelegate> {
    
          UINavigationController *navigationController;
          ViewController *viewController;
      }
    
      @property (strong, nonatomic) UIWindow *window;
      @property (strong, nonatomic) ViewController *viewController;
    

    AppDelegate.m

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
            // set initial view
           self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
           viewController = [[ViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    
           navigationController = [[CustomNavigationController alloc]
                        initWithRootViewController:viewController]; // iOS 6 autorotation fix
           [navigationController setNavigationBarHidden:YES animated:NO];
    
            self.window = [[UIWindow alloc]
               initWithFrame:[[UIScreen mainScreen] bounds]];
    
            [self.window setRootViewController:navigationController]; // iOS 6 autorotation fix
            //[self.window addSubview:navigationController.view];
    
            [self.window makeKeyAndVisible];
    
    
             return YES;
      }
    
    
      - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  // iOS 6 autorotation fix
      {
              return UIInterfaceOrientationMaskAll;
    
      }
    
  3. rootViewController で、イベントが 2 番目のビュー コントローラーをプッシュする場合は、次のようにします。

      - (IBAction)pushSecondViewController:(id)sender {
    
        // push second view controller
        SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        [self.navigationController pushViewController:secondViewController animated:YES];
       }
    
  4. 各View Controllerで、追加します

       - (BOOL)shouldAutorotate{}
       - (NSUInteger)supportedInterfaceOrientations{}
    

    iOS 6 の場合、それぞれのビュー コントローラーで、必要な向きのサポートを個別に設定できます。

    iOS 5 以下の場合、設定できます

       - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{}
    

すべての功績は、リンク内のサンプル アプリを作成した John DiSalvo に帰属します。

お役に立てれば。

于 2013-01-18T16:13:05.887 に答える
0

これをNavコントローラーに入れます。

- (BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

次に、これをルートビューコントローラに追加します。

- (BOOL)shouldAutorotate
{
    return NO;
}

それでいいはずです!

于 2013-01-18T16:24:33.970 に答える
0

許可された方向を定義する責任を UINavigationController のサブビューに委任するには、nav コントローラーの visibleViewController プロパティを使用して、ナビゲーション コントローラーがサポートされている方向を子ビューに "問い合わせる" ようにすることができます。次のコードは機能するはずです (Swift):

  1. サブクラス化されたナビゲーション コントローラー:

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    
        if let visibleView = self.visibleViewController {
            return visibleView.supportedInterfaceOrientations()
        } else {
            return UIInterfaceOrientationMask.All
        }
    }
    
  2. ナビゲーション コントローラーのサブビュー (ルート ビュー):

    // Restrict to portrait
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
    
于 2016-02-10T13:59:29.640 に答える