关于纯代码适配SizeClass

最近一直在考虑适配 iphone6 的一些问题,其实只要会用autoLayout适配起来也大概差不多!只要判断设备的SizeClaeese根据不同的尺寸注备好相应的约束就可以了

//表示 iphone手机所有机型竖屏
#define isIphonePortrait (newCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular)

//表示 iphone手机所有机型横屏  除了iphone6 plus
#define isIphoneLandscape (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact)


大部分的手机除了 IPhone 6 Plus 其他的手机大致都可以使用一套布局约束!IPhone 6 Plus  也只是在横屏下面SizeClasses才会改变。

//表示 iphone6 plus的横屏状态
#define isIphone6PlusLandscape (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)
iPad的话横屏竖屏都是一个样

//表示 Ipad 的横竖屏状态
#define isIpad (newCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)

然后我们只需要在对应的判断里面写出相应的约束就可以了,这里给出我写的一些代码片段,大家注意我这里的自动布局用到了一个第三方库文件, Masonry,大家可以在github找到!

 //获取设备的SizeClasses信息
   UITraitCollection *newCollection =  self.traitCollection;
    //判断设备的SizeClasses
    if (isIphonePortrait) {
         NSLog(@"iphone 竖屏");
        
        UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

        //[_btn setTitle:@"出现在IPhone" forState:UIControlStateNormal];
       
       
        [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.centerY.equalTo(self.view.mas_centerY);//垂直居中
            make.width.equalTo((self.view).mas_width);
            make.height.equalTo(@250);
            
        }];
        
        [_page mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.centerX.equalTo(_scrollView.mas_centerX);//分页指示器的水平居中
            
            make.bottom.equalTo(_scrollView.mas_bottom).offset(-padding.bottom);//分页指示器离_scrollView的底部 10
            make.height.equalTo(@20);
            make.width.equalTo(@20);
        }];
        
        
        //btn添加约束
        [_btn mas_makeConstraints:^(MASConstraintMaker *make) {

            
            
            make.centerY.equalTo(_scrollView.mas_centerY);//让btn的 垂直中线 对住_scrollView的垂直中线
            make.left.equalTo(_scrollView.mas_left);    //btn的最左边对着_scrollerView的最左边
            make.right.equalTo(_btn2.mas_left); //btn和btn2的间隔为0
            make.width.equalTo(_scrollView.mas_width);
            make.height.equalTo(_scrollView.mas_height);
            
        }];
        
        //给 btn2 添加布局约束
        [_btn2 mas_makeConstraints:^(MASConstraintMaker *make) {


            
            make.centerY.equalTo(_scrollView.mas_centerY);//让btn2的 垂直中线 对住_scrollView的垂直中线
            make.right.equalTo(_scrollView.mas_right);// 让btn2的最右侧对准_scrollView的最右侧
            make.width.equalTo(_btn);// btn2的宽度等于btn1的宽度
            make.height.equalTo(_btn);//btn2的高度等于 btn的高度
            
        }];
        
        
        
    }else if(isIpad){
        
        NSLog(@"ipad");
        
        //ipad布局设定
        
        
    }else if (isIphoneLandscape){
        
        
        //横屏时启动时的布局设定
        NSLog(@"iphone 横屏");
    }else if (isIphone6PlusLandscape){
        
        
        //横屏时启动时的布局设定
        NSLog(@"iphone 6 plus 横屏");
        
    }
然后在设备运行时,当你切换了设备的方向,SizeClasses也会做出相应的改变你可以通过代理方法来获取设备的 SizeClasses,然后根据相应的设备信息重新定义约束

/**
 *  当设备改变朝向时
 *  返回当前屏幕sizeClaeese的尺寸信息的代理方法
 *
 *  @param newCollection 包含了屏幕的sizeClasees的信息
 *  @param coordinator   
 */
-(void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{


    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
    
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        
        if (isIphonePortrait) {
            
            //写布局内容的改变 无改变就不用写
            
            NSLog(@"iphone 竖屏");
            
            
        }else if(isIpad){
        
            //写布局内容的改变 无改变就不用写
            NSLog(@"ipad");
        
        }else if (isIphoneLandscape){
            
            //写布局内容的改变 无改变就不用写
            NSLog(@"iphone 横屏");
            
        }else if (isIphone6PlusLandscape){
            
            //写布局内容的改变 无改变就不用写
            NSLog(@"iphone 6 plus 横屏");
        
        }
        
        
        
    } completion:nil];



}

嗯,因为也是前两天开始研究的!就说到这!也是第一次写博文,不足之处还望大家海涵!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值