关于横竖屏一直是一个坑爹的东西.
但是苹果还是不错的,好多东西都给了可视化的菜单,还是比较不错的!
上图是设置应用都支持哪几个方向的勾选菜单!
// 默认情况,home键在下
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
// home键在上
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
// home键在左
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
// home键在右
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
1.强制横屏(只在modal视图的时候有效)
适用于一些强制横屏的播放器,或者某些特殊的设计页面
#pragma mark --
#pragma mark 强制横屏代码
- (BOOL)shouldAutorotate
{
//是否支持转屏
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
//支持哪些转屏方向
return UIInterfaceOrientationMaskLandscape;
}
//进入界面直接旋转的方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeRight;
}
// 是否隐藏状态栏
- (BOOL)prefersStatusBarHidden
{
return NO;
}
2.在代码中,让应用中的部分界面自动跟着手机旋转旋转!(push和modal都有效)
适用于很多情况!!!
2.1第一步勾选,只用支持的旋转方向
旋转方向.png如果设计要求,值旋转左右的某一个方向,请自行选择!!!
2.2第二步,应用中肯定会有navVC 或者 tabVC,设置代码,因为navVC和tabVC的工作原理不一样,所以代码也不一样
navVC中的代码(nav是存在栈里的VC)
-(BOOL)shouldAutorotate
{ //允许旋转
return YES;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{ //返回nav栈中的最后一个对象支持的旋转方向
return [self.viewControllers.lastObject supportedInterfaceOrientations];
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{ // 返回nav栈中最后一个对象,坚持旋转的方向
return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}
tabVC代码(tab是选中的VC)
- (BOOL)shouldAutorotate
{
return [self.selectedViewController shouldAutorotate];
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
设置完子视图控制器容器的旋转状态和方向之后,现在是允许所有的子控制器都可以进行旋转!
2.3然后我们需要设置不想进行旋转的控制器就OK了,想进行旋转的VC什么都不用设置!
- (BOOL)shouldAutorotate
{ // 不允许进行旋转
return NO;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{ // 返回默认情况
return UIInterfaceOrientationMaskPortrait ;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{ // 返回默认情况
return UIInterfaceOrientationPortrait;
}
3.使用单例去控制navVC或者tabVC是否支持旋转,来实现界面的旋转
3.1勾选的地方全部勾掉
3.1.png3.2创建单例,加一个属性是否可以旋转
@interface Single : NSObject
@property (nonatomic, assign) BOOL isRoat;
+ (Single *)single;
@end
3.3设置navVC和tabVC里面的代码
- (BOOL)shouldAutorotate{
return [Single single].isRoat;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
// 这里可以选择任意的方向
return UIInterfaceOrientationMaskAll;
}
3.4在你想要横屏的界面代码设置
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[Single single].isRoat = YES;
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[Single single].isRoat = NO;
}
方法二的原理就是,先设置应用支持任意方向旋转,然后去设置子控制器是否可以旋转,因为如果navVC或者tabVC不支持旋转,让自控制器去实现旋转是一件非诚复杂而且容易出bug的事情!
小建议:在写项目的时候,为我们的不同旋转方向的VC各创建一个基类VC,然后新创建的VC继承于基类,这样会少写很多代码!
网友评论
app的windows的rootviewcontroller是一个uitabbarcontroller,里面放了两个UINavigationController,每个UINavigationController中有viewcontroller,结构是这样的;
假设这个viewcontroller是A和B,A设置为只支持横向,B只支持竖向,app启动时,A先展示出来,为横向,然后点击tabbar切换到B(当前手机是竖着的,并保持不旋转),发现B仍然展示为横向,只有当把手机先横向再竖向才会显示正常(正常应该为竖向),这是为什么????