iOS controller横屏与竖屏的实现

关于横竖屏一直是一个坑爹的东西.
但是苹果还是不错的,好多东西都给了可视化的菜单,还是比较不错的!

横竖屏.png

上图是设置应用都支持哪几个方向的勾选菜单!

//  默认情况,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.png
3.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继承于基类,这样会少写很多代码!

你可能感兴趣的:(iOS controller横屏与竖屏的实现)