如何实现UIViewController旋转以响应方向更改?

我的应用程序有大约10个不同的UIViewControllers,只是其中一个我想切换到横向模式,如果设备旋转。 (其余的,我想保持肖像。)

为了在这个视图上实现旋转,我需要实现其控制器的'shouldAutorotate'方法并返回YES。 由于这个视图是通过导航控制器访问的,我还需要创建一个实现'shouldAutorotate'并返回YES的UINavigationController的子类。

这个解决方案有效,但太好了。 我发现所有UIViewControllers我推到我的UINavigationController的子类响应旋转,即使我实现'shouldAutorotate'并返回NO。 (记住:我只想让一个特定的UIViewController响应旋转,而不是导航控制器堆栈中的每一个。)

所以,我的问题是:我最好如何做到这一点? 我能想出的所有解决方案似乎都很麻烦,而且更糟糕的是,似乎并不奏效。

非常感谢。


当你实现UINavigationController的时候,这个类就是你的父类,它控制着所有将被压入堆栈的子viewController。 因此,RootViewController是唯一一个对自动旋转表示是或否的控制器。 即使你在孩子视图控制器中传递Yes来自动旋转,他们也不会计数!

这是UINavigationController的本质。 所以要改变它,你有两个选择:

1-手动操作它,这需要你通过一些繁琐的代码。

2-改变您的设计,以便它与UINavigationController更加兼容。 应该旋转的单个视图应由RootViewController(而不是导航根视图控制器 - 它们命名相同,但完全不同)调用,该视图主持NavController。 当设备旋转时,它会将NavController推到视图或其他位置。

3-另一种方法也可以工作,但不推荐使用,因为它违反了MVC的概念,因为您的NavController可以侦听通知。 该CAN和SHOULD旋转的特定子视图可以投射通知 - 例如rotateMe,一旦NavController听到它,它就会旋转。

正如我所说,它会起作用,但它违反了MVC模式 - 这对Apple来说很好,但从编程的角度来看并不推荐。

如果您需要进一步解释他们中的任何一个,请告诉我。


我通过有一个根视图控制器(这可能是一个UITabBarController),并在它的viewDidLoad方法我订阅旋转事件:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didRotate:)
                                                      name:@"UIDeviceOrientationDidChangeNotification" 
                                                      object:nil];

然后在didRotate:方法中,我查看旋转发生时哪个视图控制器可见,以及手机的方向:

- (void) didRotate:(NSNotification *)notification { 
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

/*
    DEVICE JUST ROTATED TO PORTRAIT MODE

 orientation == UIDeviceOrientationFaceUp ||
 orientation == UIDeviceOrientationFaceDown

 */
if(orientation == UIDeviceOrientationPortrait) {





/*
    DEVICE JUST ROTATED TO LANDSCAPE MODE
 */
}else if(orientation == UIInterfaceOrientationLandscapeLeft ||
        orientation == UIInterfaceOrientationLandscapeRight) {






}

}

在那里didRotate:你可以看看哪些是可见的viewController,并从那里做你想做的。

当一个特定的视图控制器可见并且手机旋转到横向时,我以横向模式呈现模态视图控制器。 如果任何其他视图控制器是可见的,我忽略该事件。

我强制我的模式视图控制器在viewWillAppear方法中以横向模式显示 - 如果他们需要,我可以给任何人这个代码。

希望这可以帮助。

戴夫



仅当[[navController topViewController] isKindOfClass:[RotatingViewController class]]时,才会在导航控制器子类上返回YES

链接地址: http://www.djcxy.com/p/45925.html

上一篇: How to implement UIViewController rotation in response to orientation changes?

下一篇: Inconsistent implicit hash creation in Ruby?