您的位置:首页 > 移动开发 > IOS开发

iOS 屏幕适配的理解

2016-09-23 16:30 274 查看
由于本人很少用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(100, 100));
    }];

   //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 *
SCALE, 100 * SCALE));
    }];

    //frame写法

    //如果仅仅是尺寸上的缩放,那么间距上也就不需要去乘系数。
    button.frame = CGRectMake(10 *
SCALE, 10 * SCALE, 100 * SCALE, 100 * SCALE);

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

       button.frame = CGRectMake(10,10,100,100);
    }elseif (SCREEN_WIDTH
==375) {
        button.frame = CGRectMake(12,12,100,100);
    }else  {
        button.frame = CGRectMake(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。

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

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

以上为个人看法, 写的不好的地方还请指正谢谢,如有问题,欢迎留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: