除非只支持单个屏幕方向,否侧shouldAutorotate,viewWillTransitionToSize等方法应被调用。
不被调用的原因,可能是配置文件错误(info.plist),也可能是被Appdelegate或父ViewController拦截了。
1、info.plist配置错误
IPad 上的相关旋转方法都不执行,可能是info中的Supported interface orientations (iPad)项与General->Deployment Info下的Device Orientation配置不一致导致的。
删除不一致项应可以解决问题。
2、被Appdelegate或父ViewController拦截
有点类似触摸事件传递,屏幕旋转也是一层一层的询问。
Appdelegate ---> UIWindow.rootViewController ----> rootViewController的子ViewController
父子ViewController的概念,可以参考
UIViewController.addChildViewController
相关方法。
具体来说
Appdelegate关于旋转的方法
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window;
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window;
rootViewController关于旋转的方法
# rootViewController 是UINavigationController
-(UIInterfaceOrientationMask)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController;
- (BOOL)shouldAutorotate;
子ViewController
- (BOOL) shouldAutorotate;
-(UIInterfaceOrientationMask)supportedInterfaceOrientations;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator;
参考 https://www.jianshu.com/p/b1ebaad87a80
参考https://www.jianshu.com/p/7c1d214adcbd
参考https://www.jianshu.com/p/73be6d0e152f