我已经在SO上阅读了很多答案,但我似乎无法在iOS7上进行自动旋转。
我只需要一个视图控制器来旋转,所以我不想在我的Info.plist中设置旋转设置。
据我了解Apple的文档,单个视图控制器可以通过简单地覆盖两个方法来覆盖全局旋转设置(来自Info.plist)。 Info.plist设置为仅允许Portrait,我的视图控制器实现以下方法:
- (NSUInteger)supportedInterfaceOrientations
{
NSLog(@"%s", __PRETTY_FUNCTION__);
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (BOOL)shouldAutorotate
{
NSLog(@"%s", __PRETTY_FUNCTION__);
return true;
}
我在旋转时看到那些NSLog语句但没有旋转。
如果我使用正确的旋转设置配置Info.plist,我的视图将会旋转,但如果我尝试依赖我的视图控制器则不会。
不确定是否重要,但我正在尝试旋转的视图来自使用自动布局的.xib。
此外,我的ViewController以模态方式呈现,并包含在导航控制器中。我试过单独呈现视图控制器,但这不起作用。我也试过adding a category to UINavigationController从它的topViewController获取它的自动旋转方向。
答案 0 :(得分:17)
在我的情况下,我有一个新的iOS7应用程序,已经创建了大约30个视图控制器。我只需要在一个模态视图控制器上进行自动旋转。我不想更新预先存在的视图控制器。
我在plist中选择了我想要的方向:
然后我在UIViewController上为我的app委托添加了一个类别:
@implementation UIViewController (rotate)
-(BOOL)shouldAutorotate {
return NO;
}
@end
然后在单模态视图控制器中我想要旋转我添加了这个方法:
-(BOOL)shouldAutorotate {
return YES;
}
我还发现,如果我的视图控制器不是模态VC,我需要在UINavigationController上添加类别方法,对于根视图控制器之后的所有VC,作为视图控制器的导航堆栈的一部分 - 与此类似:https://stackoverflow.com/a/20283331/396429
答案 1 :(得分:16)
简单但工作得很好。 IOS 7.1和8
AppDelegate.h
@property () BOOL restrictRotation;
AppDelegate.m
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
return UIInterfaceOrientationMaskPortrait;
else
return UIInterfaceOrientationMaskAll;
}
的ViewController
-(void) restrictRotation:(BOOL) restriction
{
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = restriction;
}
viewDidLoad中
[self restrictRotation:YES]; or NO
答案 2 :(得分:7)
您需要将plist值设置为所有可能的值,然后根据需要限制它们(在导航控制器和TabBar控制器中。来自UIViewController类描述:
在iOS 6及更高版本中,您的应用支持界面方向 在您的应用的Info.plist文件中定义。视图控制器可以覆盖 supportedInterfaceOrientations方法限制列表 支持的方向。通常,系统仅调用此方法 在窗口的根视图控制器或视图控制器上 呈现以填满整个屏幕;子视图控制器使用 窗口的一部分由父视图为它们提供 控制器,不再直接参与决定什么 支持旋转。应用程序方向的交集 掩码和视图控制器的方向掩码用于确定 视图控制器可以旋转到哪个方向。
答案 3 :(得分:1)
我遇到了这样的问题 - 在我的应用中只有一个横向视图。 我用下面的代码来处理它。
#import "objc/message.h"
-(void)viewWillAppear:(BOOL)animated{
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft);
}
答案 4 :(得分:0)
我知道这已经过时了但我最终处于一个更独特的情况,我们在整个应用程序中都有50多个ViewController我拒绝通过修改并支持相同的方向,但只有一个或两个。带我回答我的问题。我创建了一个覆盖的UIViewController类别 - (BOOL)shouldAutorotate总是返回NO或YES,具体取决于设备类型等(这也可以通过支持的接口方向完成)。然后在ViewControllers上我想支持更多然后只是肖像,我调到shouldAutorotate返回YES。然后在使用以下方法在父ViewControllers viewWillAppear方法中关闭视图时强制方向更改:
[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].
完成所有操作后,我在一些ViewControllers上用<完成了我想要的一切。使用宏进行调配的30行代码。如果我通过在应用程序中的所有VC上替换shouldAutorotate和supportedInterfaceOrientations来完成它,我将有大约250行代码。并且首先添加了许多笨拙的工作。