navigationController推送ViewControllers不会自动旋转

时间:2011-07-06 19:41:57

标签: iphone ios ipad uiviewcontroller

我很难让导航控制器正确自动旋转。显示屏将在初始视图(根视图控制器)上自动旋转,但不会在任何推入的新视图上旋转。它保持了推送时初始视图所具有的视图方向。

在我的App Delegate中,我有一个导航控制器并按下它的视图。

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

在根视图控制器中,我允许所有方向,并将其他视图推送到控制器的堆栈。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return YES;
}

ParkingListController *parklc = [[ParkingListController alloc] autorelease];
[[self navigationController] pushViewController:parklc animated:YES];

我看到"是的,我们应该!"加载新视图时记录一次,但实际旋转设备时不会触发。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    NSLog(@"Yes, we should!");
    return YES;
}

我没有任何init覆盖,info.plist列出了所有四个方向。

我错过了什么?谢谢!

编辑2011-07-07:

奇怪的是,从表视图中选择项目时推送的地图视图会自动旋转!为什么它可以在它来自的表视图时旋转?

4 个答案:

答案 0 :(得分:4)

您正在使用UINavigationController,它应该返回true以进行旋转。请扩展UINavigationController并在Interface builder中使用扩展类。

#import <Foundation/Foundation.h>
@interface IRUINavigationController : UINavigationController {
}
@end

#import "IRUINavigationController.h"
@implementation IRUINavigationController
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self.visibleViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
} 
@end

我已经使用过很多项目而且很有效。

答案 1 :(得分:0)

您是否确保ParkingListController的shouldAutorotateToInterfaceOrientation也返回YES?

答案 2 :(得分:0)

我建议两件事:

  1. 确保您的所有UIViewController s shouldAutorotateToInterfaceOrientation返回YES;

  2. 将日志消息放入willRotateToInterfaceOrientation以验证视图对设备轮换的反应; shouldAutorotateToInterfaceOrientation是一种可以通过框架以不可预测的方式调用的方法(即,在自动旋转时并不总是调用它)。

  3. 除此之外,它应该有用。

答案 3 :(得分:0)

推入导航控制器堆栈的每个视图控制器都必须支持相同的方向。这意味着不可能让一些视图控制器仅支持肖像,而其他视图控制器仅支持横向。换句话说,同一导航控制器堆栈上的所有视图控制器应在委托中返回相同的内容:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

但是有一个简单的解决方案!这是一个从肖像到风景的例子。以下是执行此操作的步骤,以下是支持它的代码。

  1. 创建一个'假'视图控制器,它将作为子导航控制器的根目录。此视图控制器应支持格局。
  2. 创建UINavigationController的新实例,以root身份添加“假”视图控制器的实例,并将横向视图控制器的实例添加为第二视图控制器
  3. 将UINavigationController实例显示为父视图控制器
  4. 的模态

    首先,使用以下代码创建一个新的视图控制器(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));
    } 
    

    以下是显示您希望以横向模式显示的视图控制器的代码:

    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));
    }