能够实现的功能
1.启动页的屏幕方向任你选择
2.达到每个控制器都可以自由调整横竖屏方向.
建议
项目中最好用约束来实现界面的布局,因为屏幕发生旋转后控制器都会调用
- viewWillLayoutSubviews
- viewDidLayoutSubviews
这两个方法,所以通过约束可以实时的根据屏幕调整尺寸,而通过计算出来的frame是在 viewDidLoad 这个方法中计算出来的,屏幕旋转不会再次调用这个方法
1.在AppDelegate 中实现以下代理方法
- (UIInterfaceOrientationMask)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
代理中已经返回了支持的反向,系统不会从.info中获取了
2.在根控制器重写以下属性
在一个控制器第一次即将显示时会先调用appDelegate这个方法
- (UIInterfaceOrientationMask)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
然后调用
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
///设备支持的方向
- (BOOL)shouldAutorotate
///设备旋转方向后是否重新布局,更新尺寸
最后在调用appDelegate的方法
topViewController 是导航栏的栈顶控制器,push 进来的控制器
visibleViewController 是导航栏的可见控制器,
总之要知道优先级的问题,general == appDelegate >> rootViewController >> nomalViewController
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
/// 只在present 时会调用,
/// 这个方法优先级比supportInTerFace高,当这个方法支持的,supportInTerFace没有支持会造成崩溃
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:
(id<UIViewControllerTransitionCoordinator>)coordinator
当屏幕发生旋转时,就会触发这个方法