编程技术记录

世界你好!

除非只支持单个屏幕方向,否侧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

© Beli. All Rights Reserved.