我已经阅读了有关同一问题的其他几个问题(和答案),但找不到针对我案例的单一工作解决方案。
我正在使用Storyboard为iOS7开发iOS应用程序。这个应用程序由多个UIViewControllers组成。除了一个必须只显示纵向界面方向,所有这些都必须显示。我的问题是所有的视图都不应该旋转。
在XCode项目设置中,我勾选Portrait
和Landscape Left
设备方向。
以下网址提供了相关的Apple文档:Controlling What Interface Orientations Are Supported (iOS 6),supportedInterfaceOrientations和preferredInterfaceOrientationForPresentation。
我添加到UIViewControllers
中的所有Storyboad
(但可以旋转的那个)以下方法:
- (BOOL) shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
}
不幸的是,所有视图都旋转到横向左侧位置。为什么呢?
答案 0 :(得分:0)
从这里得到解决方案:iOS6: supportedInterfaceOrientations not working (is invoked but the interface still rotates)。
在写我之前我没有找到那个问题。对不起。
问题出在Apple文档中。在一个地方他们写这个:
当在根视图控制器上显示视图控制器时, 系统行为有两种变化。首先,提出的观点 当使用controller而不是根视图控制器时 确定是否支持方向。
你认为决定是由占据屏幕的UIViewController决定的。
在UIViewController类引用中,他们写了这个:
通常,系统仅在根视图上调用此方法 窗口的控制器或视图控制器呈现填充 整个屏幕;子视图控制器使用窗口的一部分 由他们的父视图控制器提供给他们,不再 直接参与有关支持轮换的决策。 应用程序的方向掩码和视图的交集 控制器的方向掩码用于确定哪些方向 视图控制器可以旋转到。
您应该从中了解到使用UINavitationController时第一句不适用。
答案 1 :(得分:0)
您需要向方法- (BOOL) shouldAutorotate
添加更多代码,例如纵向方向
- (BOOL)shouldAutorotate{
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait) {
return YES;
}
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
NSLog(@"rotate");
}
您需要在App Delegate中添加此方法
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window // iOS 6 autorotation fix {
return UIInterfaceOrientationMaskAll;
}
答案 2 :(得分:0)
确保在项目中启用纵向,横向右和横向左方向。然后,如果要阻止特定视图的某些方向:
– application:supportedInterfaceOrientationsForWindow:
如果要强制显示特定视图的方向,请检查问题How to handle different orientations in iOS 6.在那里查看答案,了解您需要的项目示例。
基本上,您需要在viewcontroller(要旋转的控件)中嵌入自定义导航控制器。在此自定义导航控制器中添加以下方法
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
并添加到应旋转的视图控制器:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}