iOS controller横屏与竖屏的实现

作者: 武小寺 | 来源:发表于2016-06-20 19:17 被阅读2285次

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

横竖屏.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继承于基类,这样会少写很多代码!

相关文章

网友评论

  • 2ede4a8a7da0:楼主 : 麻烦问个问题 ,我这个是一个老的项目 里面有Nav 和 Tabber, 是一年前的项目了。最近来的新的需求 只要求 某一个页面需要横屏,按照你的第二种方法 是在不需要旋转的设置为NO,那样我得代码量会很大 , 也可能会乱,能不能 只针对某个页面需要横屏做处理 ???谢谢
    武小寺:@Mr_hao 之前的VC没有基类吗,你搞个基类,只要旋转的那个不继承就行,别的继承这个基类,要不就强制旋转,用第一种方法
  • Damon4Zhou:有个问题,我选择第二种方法:
    app的windows的rootviewcontroller是一个uitabbarcontroller,里面放了两个UINavigationController,每个UINavigationController中有viewcontroller,结构是这样的;
    假设这个viewcontroller是A和B,A设置为只支持横向,B只支持竖向,app启动时,A先展示出来,为横向,然后点击tabbar切换到B(当前手机是竖着的,并保持不旋转),发现B仍然展示为横向,只有当把手机先横向再竖向才会显示正常(正常应该为竖向),这是为什么????
    Damon4Zhou:@武小寺 真机
    武小寺:@Damon4Zhou 你是模拟器测试的还是真机测试的,我真没试过这种的
  • shopping627:谢谢楼主,我的问题解决了。
    Damon4Zhou:@武小寺 第二种方法比较实用
    武小寺:@shopping627 解决了就好,多交流
  • sfandy:这种方式问题很多
    sfandy:@Damon4Zhou 你看看我写的就知道了。我已经解决了。
    Damon4Zhou:@sfandy 会出什么问题??请教下,有什么更好的方法吗?

本文标题:iOS controller横屏与竖屏的实现

本文链接:https://www.haomeiwen.com/subject/duwwdttx.html