iOS 屏幕适配的理解

来源:互联网 发布:linux 修改服务器时区 编辑:程序博客网 时间:2024/06/14 19:30

由于本人很少用xib storyboard 所以这里的说是代码层面的适配.


手写代码,很多人在用代码适配都是使用Masonry或者UIView的Category,搭配上一个屏幕宽度比例或者高度比例的系数(

[[UIScreen mainScreen]bounds].size.宽或者高 / 屏幕的宽度或者高度)。其实用多了你会发现其实适配就是那么回事吧。


为什么这么说。在我理解,其实适配就是设计对这个控件摆放的一个要求。什么意思?


比如设计对屏幕上的这个button的要求就是在不同屏幕下都是距离上、左10px,宽高是100 * 100。那么这个button就不需要去适配。

    UIButton *button = [UIButton new];

    [self.view addSubview:button];

    //Masonry 

    [button mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.top.equalTo(self.view).offset(10);

        make.size.mas_equalTo(CGSizeMake(100100));

    }];


   //frame

   button.frame =CGRectMake(10,10,100,100);


  如果要求这个button在不同屏幕下会有相应的缩放,你可以去乘以一个系数比例。Tips:为了适配4和5(同宽度,不同高度),一般会乘宽度比较好,当然也可以乘以高度比,这里主要看需求。


    //Masonry 

    [button mas_makeConstraints:^(MASConstraintMaker *make) {

       //如果仅仅是尺寸上的缩放,那么间距上也就不需要去乘系数。

        make.left.top.equalTo(self.view).offset(10 * SCALE);

        make.size.mas_equalTo(CGSizeMake(100 * SCALE100 * SCALE));

    }];


    //frame

    //如果仅仅是尺寸上的缩放,那么间距上也就不需要去乘系数。

    button.frame = CGRectMake(10 * SCALE10 * SCALE100 * SCALE100 * SCALE);


如果是特殊要求,那么就得根据屏幕的尺寸判断去写多套布局,这里只展示frame版本,Masonry在约束上也是根据需求去判断。

    if (SCREEN_WIDTH == 320) {

       button.frameCGRectMake(10,10,100,100);

    }elseif (SCREEN_WIDTH ==375) {

        button.frameCGRectMake(12,12,100,100);

    }else  {

        button.frameCGRectMake(15,15,120,120);

    }

  

  Masonry和frame的比较:

         1.在代码量方面,Masonry会偏多一些,frame在不需要计算行高的地方也就一行。


        2.在影响方面,Masonry更新控件的约束会影响其他控件相对于这个控件的位置。 frame只会影响自己,并不会影响其他的控件。 

举个例子:

       leftButton.frame = CGRectMake(0, 0, 100, 100);

       rightButton.frame = CGRectMake(leftButton.right , 0 , 100, 100);

       改变leftButton的宽度 , leftButton.frame = CGRectMake(0, 0, 200, 100);   这时rightButton的x点还是100,并不会变成200.

       如果使用Masonry

      [leftButton mas_updateConstraints:^(MASConstraintMaker *make) {

           make.size.mas_equalTo(CGSizeMake(200,100));

      }];

      这时rightButton x点的位置会变为200。


       3.在执行顺序方面,Masonry代码执行时间不会立刻执行(block),frame会立刻执行。


       4.控件设置方面, Masonry在某些特定情况优于frame。详情看Masonry官方demo。


总着来说,具体的适配,完全依赖于设计的要求。

使用适配的方式,看个人喜好和实际需求吧。怎么方便怎么来。

以上为个人看法, 写的不好的地方还请指正谢谢,如有问题,欢迎留言。

0 0
原创粉丝点击