博客> 关于适配方式的选择(storyboard、Xib、纯代码)
关于适配方式的选择(storyboard、Xib、纯代码)
2017-11-21 17:59 评论:0 阅读:358 d2698255
ios Storyboard 自动布局 代码 适配方法

作为一个ios开发的新手,很多人在刚开始接收项目的时候都会遇到选择适配方案的问题,今天 就结合我的项目经验谈一谈我对ios开发中适配方案的理解,为各位开发者 尤其是刚入门者提供一个有价值的参考。 首先我们分一下类 苹果为我们的开发提供了两种适配方案,我们按出现的时间顺序写 1、纯代码(frame,masonry) 2、storyboard,xib

首先有一点 我们需要明白,存在就是合理,如果你用着哪种适配方法感觉他的问题很大,不如XX好用,那很有可能是你缺少足够的知识,所以导致你在使用的时候考虑复杂了。再有,就算考虑复杂了,就算你不按照苹果给的方法去执行,你最后依然可以做出适配。所以说啊,适配本身很容易做,关键我们能否选择出适合自己项目的适配方案最重要。 好了 怎们来点干货 1 关于纯代码 (1)经常听见有人跟我说计算frame多么复杂麻烦,然后算一个控件的百分比怎么怎么复杂。在这里我可以告诉你,只要你合理运用宏定义,计算frame可以说简单到就跟你设置定死的frame一样简单,你觉得思考复杂,那是因为你没有在思考。来看看 我设置的宏定义。

//屏幕比例

#define SCALE_SCREEN SIZEWIDTH/414
//不需要等比缩放的控件
#define SCALE(A) 0.383*A
//需要等比缩放的空间
#define SCALE1080P(A) A*0.383*(SIZEWIDTH/414)

#define SIZEWIDTH   [[UIScreen mainScreen] bounds].size.width
#define SIZEHEIGHT  [[UIScreen mainScreen] bounds].size.height

我来讲解一下,A*0.383中的A是公司美工在给我的标注图中标注的像素。由于美工给我的是1080p的效果图(也就是6p的效果图),换算成我们代码中用到的坐标系统dt,就是乘0.383。(如果想知道0.383怎么来的,自己脑补6p的换算关系) 在实际的工程适配中,我将效果图中的UI分为两类,一类是大小不变的,即任何屏幕大小都是一样,如navigation和tabbar。对于这一类,我们采用上边的SCALE()这个宏来设定frame。另一类是需要我们等比缩放的,这一类我们采用SCALE1080P()这个宏。至于那些分不清类别的,建议问问你们的UI,毕竟是人家是专业的。 除了这两个自定义的宏,我们还需要使用系统提供的CGRECTGETMAX(MIN,MID)Y(X)这个系列宏。这几个宏配合起来使用,你就发现传统frame的布局是多么的易用。 例:下面来个cell布局展示。

  _imageIcon = [[UIImageView alloc]initWithFrame:CGRectMake(SCALE1080P(45), SCALE1080P(42), SCALE(90), SCALE(42))];
    _titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(_imageIcon.frame)+10, SCALE1080P(38), SCALE1080P(520), SCALE(50))];
    _titleLabel.font = FONE_MY(42);
    _titleLabel.textColor = COLOR_TITLE_MAIN;
    _timeLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(_titleLabel.frame), SCALE1080P(42), SCALE1080P(270), SCALE(42))];
    _timeLabel.font = FONE_MY(36);
    _timeLabel.textAlignment = NSTextAlignmentRight;
    _timeLabel.textColor = COLOR_TITLE_999999;

    _imageArrow = [[UIImageView alloc]initWithFrame:CGRectMake(SIZEWIDTH - SCALE1080P(45)-16, SCALE1080P(42), 16, 16)];

    _imageArrow.image = [UIImage imageNamed:@"右箭头.png"];
    _detailLabel = [[UILabel alloc]initWithFrame:CGRectMake(SCALE1080P(45), CGRectGetMaxY(_imageIcon.frame)+SCALE1080P(36), SIZEWIDTH - SCALE1080P(90), 0)];
    _detailLabel.numberOfLines = 2;
    _detailLabel.textColor = COLOR_TITLE_999999;
    _detailLabel.font = FONE_MY(39);

    [self.contentView addSubview:_imageIcon];
    [self.contentView addSubview:_titleLabel];
    [self.contentView addSubview:_timeLabel];
    [self.contentView addSubview:_imageArrow];
    [self.contentView addSubview:_detailLabel];
    _line = [[UIView alloc]initWithFrame:CGRectMake(0,SCALE1080P(299), SIZEWIDTH, 0.5)];
    _line.backgroundColor = COLOR_LINE_SYSTEM;
    [self.contentView addSubview:_line]; 

怎么样,这样的布局打眼一看你就明白是怎么回事,要想修改哪个UI,还不是分分钟的事。

(2)接下来谈一谈 masonry masonry是一个第三方,对系统的约束api进行了封装,虽然使用简单,但是在使用的过程中你要不断的去想象和计算控件的约束条件,约束本身就是一个比较严格的东西,你多添加或者少添加了,都会造成各种不知名的错误。我在使用过程中也发现了一个缺点,使用了masonry的控件,是没有frame的。所以上边的方法和这个方法不能混着用。有些要依赖控件frame的代码,那么这个控件最好不要用约束。(控件自己根据约束去计算frame,所以控件的frame只有在约束运行时才会给出)当然masonry用习惯了,开发效率还是很高的,代码规范也好看。

2 关于自动布局 其实在我看来,storyboard和xib就是一个东西,原理都是一样的。 首先这个自动布局的一大优点就是 简单,直观。平时写个小demo或者小游戏,拖啊拖还是很爽的。而自动布局的基础就是约束。所以如果不把各个约束条件玩6,就不要妄想使用xib,否则会给你带来各种灾难,相反,如果将约束理解透彻,那么对于UI这部分效率提高几倍都不止吧!

我强烈不推荐使用xib,我的第一个工程采用xib,每个文件都创建一个xib,工程进行还不到一半时,xcode在编译工程的时候会出现各种卡顿。我猜测就是我使用了大量的xib文件导致的。后期工程都采用纯代码,未出现相同问题。

收藏
0
sina weixin mail 回到顶部