iOS 控制屏幕旋转
在你想支持横竖屏的viewController里面重写两个方法:
1
2
3
4
5
6
7
8
9
10
11
|
// 支持设备自动旋转 - ( BOOL )shouldAutorotate { return YES; } // 支持横竖屏显示 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } |
这样在这个viewController中就可以横竖屏切换了。
注意如果你 window 的 rootViewController 是一个navigationController,可能会出现以下问题:
1. 你的navigationController只支持竖屏,但是你push到了某个新的controller中,这个controller支持横竖屏,当你在新的controller中切换到横屏后(也有可能在切换到横屏然后pop回来后),这时候程序会闪退,因为你的navigationController不支持横屏。
2. 带有导航栏的 viewcontroller 无法进入此方法
- (BOOL)shouldAutorotate {
if (!isRotation) {
return YES;
} else {
return NO;
}
}
如果你想解决这个问题,就需要自己写一个UINavigationController的子类,在这个类中重写方法:
#import <UIKit/UIKit.h>
@interface UZUIAssetNavigationController : UINavigationController
@property (nonatomic, assign) BOOL isRotation;
@end
@implementation UZUIAssetNavigationController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
- ( BOOL )shouldAutorotate { return [self.viewControllers.lastObject shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.viewControllers.lastObject supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; } |
然后用这个类去创建实例作为window的rootViewController,这样就可以避免这个问题了。
UZUIAssetNavigationController *assetGroupNavi = [[UZUIAssetNavigationController alloc]initWithRootViewController:assetGroupVc];
[self.viewController presentViewController:assetGroupNavi animated:YES completion:^{}];