由于项目需求,需要实现app中的其中一个页面支持横竖屏,由于之前接触此方面甚少,着实花费了一些时间研究~怕自己忘记也为了给他人提供一些便利,故写此文~
我用PPT大致画了一下该项目的页面结构:
而我要实现的功能是只允许Vc1横屏,其它页面只支持竖屏。在完成这个功能的过程中,我试了好多错误的方法,在看过很多技术博客、踩过很多坑之后,我总结了iOS一下关于横竖屏开发的思路:
一个app在运行期间只会访问根控制器是否支持横竖屏
在此项目中,根控制器是MainPageVC的控制器UINavigationController。
换句话说,一个UIViewController是否支持横竖屏,要么在其根Controller显示地写出来,要么隐式地在根Controller获取其管理的所有子Controller是否支持横竖屏。由于UIController的基类定义了三种方法用来获取是否支持横竖屏,因此只要在每个Controller中重写这些方法即可。(只在支持横屏的UIViewController中重写这三个方法是不够的)
下面是三个需要重写的方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
}
- (BOOL)shouldAutorotate {
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
}
在根控制器中,需要重写以上三种方法,通过判断找到支持横屏的子控制器,对其设置允许横竖屏,其余控制器只允许竖屏。
这个例子的根控制器即为MainPageVC的控制器UINavigationController,由于需要对根控制器进行代码设置,因此我在项目中新建了BaseNavigationController的类文件,对于横竖平的判断,代码如下:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
UIViewController*vc =self.topViewController;
if ([vc isKindOfClass:[BaseTabBarViewController class]] || [vc isKindOfClass:[Vc1 class]]) {
return[vc shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}
return(toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
- (BOOL)shouldAutorotate {
UIViewController*vc =self.topViewController;
if ([vc isKindOfClass:[HomeViewController class]] || [vc isKindOfClass: [Vc1 class]] || [vc isKindOfClass: [BaseTabBarViewController class]] {
return [vc shouldAutorotate];
}
return false;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
UIViewController *vc = self.topViewController;
if ([vc isKindOfClass:[Vc1 class]] || [vc isKindOfClass:[BaseTabBarViewController class]]) {
return [vc supportedInterfaceOrientations];
}
return UIInterfaceOrientationMaskPortrait;
}
然后,在控制器BaseTabBarViewController中,也要重写上述三个方法,因为根控制器有去访问BaseTabBarViewController的这三个方法([vc supportedInterfaceOrientations]),严格地说
是通过访问get方法来获取三个变量。
以此类推,最后会实现app只支持某个UIViewController横屏,其余UIViewController均只支持竖屏。
题外话:
要想做一个出色的程序员(我应该写“媛”),并不是只完成手头的任务就可以了,遇到没做过的功能时,在网上随手copy代码确实可以完成功能,但是此时我们并没有真的学会该功能的研发,这样做对于我们技能的提升没有一点好处,以后再做此类功能的开发时还需要浪费甚至更多的时间去查别人的代码,而不是双手“行云流水”地敲出自己写的代码。所以作为程序员,一定要脚踏实地,做一个学会一个,掌握扎实的基本功,这样才可以走上程序员巅峰~