ios 屏幕旋转适配(横屏适配)

屏幕的横竖屏适配有很多种,今天写直播demo的时候发现给播放器一套约束或者frame,自动切换横屏的时候布局混乱拉伸。

这第一种方法,直接监听横竖屏切换,然后改变布局代码,纯代码布局基本都是这个思路。

/** 注册屏幕横竖通知 */

//开启和监听 设备旋转的通知(不开启的话,设备方向一直是UIInterfaceOrientationUnknown)
    if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) {
        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    }
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleDeviceOrientationChange:)
                                                name:UIDeviceOrientationDidChangeNotification object:nil];

/** 通知事件处理 */

//设备方向改变的处理
- (void)handleDeviceOrientationChange:(NSNotification *)notification{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    switch (ddeviceOrientation) {
        case UIDeviceOrientationFaceUp:
            NSLog(@"屏幕朝上平躺");
            break;
        case UIDeviceOrientationFaceDown:
            NSLog(@"屏幕朝下平躺");
            break;
        case UIDeviceOrientationUnknown:
            NSLog(@"未知方向");
            break;
        case UIDeviceOrientationLandscapeLeft:{
            NSLog(@"屏幕向左横置");
            //以左横为例,改变frame的话可以加动画,也可以用masonry处理(mas_remake),视情况选择,一般来说不需要每种情况都处理,左横右横直立三种就差不多了。
                [UIView animateWithDuration:1.0 animations:^{
                    _player.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
                }];
                
                [_player.view mas_remakeConstraints:^(MASConstraintMaker *make) {
                    make.top.mas_equalTo(0);
                    make.left.mas_equalTo(0);
                    make.size.mas_equalTo(CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height));
                }];
}
            break;
        case UIDeviceOrientationLandscapeRight:
            NSLog(@"屏幕向右橫置");
            break;
        case UIDeviceOrientationPortrait:
            NSLog(@"屏幕直立");
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            NSLog(@"屏幕直立,上下顛倒");
            break;
        default:
            NSLog(@"无法辨识");
            break;
    }
}

/** 最后在dealloc中移除通知 和结束设备旋转的通知 */

- (void)dealloc{
    //...
    [[NSNotificationCenter defaultCenter]removeObserver:self];
    [[UIDevice currentDevice]endGeneratingDeviceOrientationNotifications];
}

/** 提示一下,需要记住以下几种方法,这些方法都是tabbar navigation viewcontroller 层层传递,具体使用另行查阅资料*/

- (BOOL)shouldAutorotate{
    //是否自动旋转,返回YES可以自动旋转,返回NO禁止旋转
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    //返回支持的方向
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    //由模态推出的视图控制器 优先支持的屏幕方向
}
第二种就是xib创建的视图,Trait Variations其实就是iOS8.0之后取代sizeClass而已,具体的东西得自己去研究。

拖入控件后,勾上此处的width,然后开始布局添加约束,添加完之后点击Down Varying,此间添加的所有约束就只针对竖屏生效,反之点击height,约束就对横屏生效。


image.png

image.png
第三种,还是xib,针对一个约束添加多个不同优先级的约束,把约束关联到代码里面,然后跟第一种方法一样监听横屏,再把约束的优先级更改,便可使相应优先级的约束生效(默认第一优先级1000生效),如图默认约束为60,49为次优先级,可在代码中使其生效。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *testConstraint;
_testConstraint.priority = UILayoutPriorityDefaultLow;

image.png

第四种,随便提一下就行,在我看来也就是sizeClass和第二种一样的,如下图,竖屏状态是wC:hR 横屏下是wC:hC (w是width h是height,C是Compact R是Regular) ,可以针对横屏和竖屏分别添加或修改约束值。

注意:不管是第二种还是第四种,如果在拖入控件之前就限制了方向,那么你就会发现切换到另一种方向的时候此控件是不存在的。只有拖入控件时installed选中或者第二种没有操作,才会两种状态都存在控件,运行也是一样的效果。具体操作坑还是比较多的,所以需要自己去实践,这里只提供一个思路。

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容