我有一个基于导航的应用程序,我希望其中一个viewcontrollers支持横向方向。对于那个viewcontroller(vc1),在shouldAutorotate中,我为所有方向返回YES,而在其他控制器中我返回YES仅用于纵向模式
但即便如此,如果设备处于横向模式并且我从vc1进入下一个屏幕,则下一个屏幕也会以横向模式旋转。我假设如果我仅为肖像模式返回YES,则屏幕应仅以纵向显示。
这是预期的行为吗?我如何实现我的目标?
感谢。
答案 0 :(得分:24)
如果您使用UIViewController的 shouldAutorotateToInterfaceOrientation 方法,则不能仅为其中一个视图控制器支持横向。
您只有两个选择,即所有视图控制器是否支持景观,或者没有视图控制器支持它
如果只想为一个支持景观,则需要检测设备旋转并在viewcontroller中手动旋转视图
您可以使用通知检测设备旋转。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
然后,您可以在检测到设备旋转时旋转视图。
- (void)didRotate:(NSNotification *)notification {
UIDeviceOrientation orientation = [[notification object] orientation];
if (orientation == UIDeviceOrientationLandscapeLeft) {
[xxxView setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
} else if (orientation == UIDeviceOrientationLandscapeRight) {
[xxxView setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
[xxxView setTransform:CGAffineTransformMakeRotation(M_PI)];
} else if (orientation == UIDeviceOrientationPortrait) {
[xxxView setTransform:CGAffineTransformMakeRotation(0.0)];
}
}
答案 1 :(得分:5)
当我在portait模式下需要所有视图控制器时,我也有这种情况,但其中一个也可以旋转到横向模式。而这个视图控制器有导航栏。
为此,我创建了第二个窗口,在我的例子中是摄像机视图控制器。当我需要显示摄像机视图控制器时,我会显示摄像机窗口并在需要按下另一个视图控制器时隐藏。
您还需要将此代码添加到AppDelegate。
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (window == self.cameraWindow)
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
return UIInterfaceOrientationMaskPortrait;
}
答案 2 :(得分:0)
当我为我的应用程序工作时,我建议您使用此解决方案。通过在shouldAutorotateToInterfaceOrientation方法方向类型中使用一些条件,我们可以解决此问题。只需尝试使用此链接将帮助您。