Autoresizing与AutoLayout

Autoresizing

  • Autoresizing是在AutoLayout流行以前的一种屏幕适配技术,Autoresizing在当时很好的解决了子控件在父控件的位置问题,而且只需要很简单的设置即可.
  • 在xcode7.3中,使用Autoresizing时是需要先关掉AutoLayout的.
  • Autoresizing的设置
    • 通过storyboard
    • 选中要设置的控件,来到下图的位置

在Autoresizing的选项后面有六根线,外面有四条(上下左右),里面有两条(宽高).在外面的4跟线中,如果在某个方向是是实线,代表距离该方向的距离固定.里面的两根线中,实线代表宽度或高度固定,虚线代表跟随父控件等比例拉伸.

  • 通过代码
  • 拿到设置的控件(以button为例)
    //设置伸缩左边间距(也就是控件的右边距是固定的)
    self.button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;

如果设置多个方向的约束,可以在每个约束的后面以 | 运算符隔开.

    // 设置左/上伸缩,宽/高伸缩
    self.button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;

下面是Autoresizing常用的代码约束:

 /*
    UIViewAutoresizingNone                 //无
    UIViewAutoresizingFlexibleLeftMargin   //左边伸缩
    UIViewAutoresizingFlexibleWidth        //宽度伸缩
    UIViewAutoresizingFlexibleRightMargin  //右边伸缩
    UIViewAutoresizingFlexibleTopMargin    //顶部伸缩
    UIViewAutoresizingFlexibleHeight       //高度伸缩
    UIViewAutoresizingFlexibleBottomMargin //底部伸缩
     */

注意:Autoresizing只能解决控件在父控件之间的位置,不能解决子控件与其他控件之间的位置,所以Autoresizing的局限性比较大.

AutoLayout

  • AutoLayout是苹果官方推出的一种自动布局技术,它很好的解决了Autoresizing所不能解决的问题,所以在现阶段屏幕匹配方面大家都喜欢使用AutoLayout.
  • AutoLayout的使用也比较简单,只需选中控件,设置位置宽高等约束,就决定了该控件在父控件中的布局.

storyboard实现AutoLayout,选中要设置的空间,点击下图

图1

图2

图1用来设置对齐约束,图2用来设置位置(或与其他空间的间距)与宽高约束.
设置完毕之后可以直接使用快捷键(command + option + =)来更新约束.

代码实现AutoLayout
在使用代码实现AutoLayout时,需要先将Autoresizing禁用,否则两者会引起冲突,使控件无法正常显示.

    //禁用button的Autoresizing功能
    self.button.translatesAutoresizingMaskIntoConstraints = NO;
    //自定义一个blueView
    UIView *blueView = [[UIView alloc] init];
    blueView.frame = CGRectMake(50, 100, 200, 200);
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    //创建宽度约束
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:200];
    //添加宽度约束
    [self.button addConstraint:widthConstraint];

创建约束方法中的参数如下:

+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
view1:需要添加约束的view
attr1:view的属性(上下左右宽高)
relation:与其他控件的关系(`<`=(NSLayoutRelationLessThanOrEqual),`=`(NSLayoutRelationEqual),`>=`(NSLayoutRelationGreaterThanOrEqual))
view2:其他view(如不需要设置可填nil)
attr2:其他view的属性(上下左右宽高,不设置可填`NSLayoutAttributeNotAnAttribute`)
multiplier:乘数(填1是乘以view2本身的宽度)
constant:需要加上的数值

其中view的常用属性如下:

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
    // 位置
    NSLayoutAttributeLeft ,
    NSLayoutAttributeRight,
    NSLayoutAttributeTop,
    NSLayoutAttributeBottom,
    NSLayoutAttributeLeading,
    NSLayoutAttributeTrailing,
    NSLayoutAttributeWidth,
    NSLayoutAttributeHeight,
    NSLayoutAttributeCenterX,
    NSLayoutAttributeCenterY,
    NSLayoutAttributeBaseline,
    NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline,
    NSLayoutAttributeFirstBaseline 
    // 间距
    NSLayoutAttributeLeftMargin,
    NSLayoutAttributeRightMargin, 
    NSLayoutAttributeTopMargin ,
    NSLayoutAttributeBottomMargin ,
    NSLayoutAttributeLeadingMargin ,
    NSLayoutAttributeTrailingMargin ,
    NSLayoutAttributeCenterXWithinMargins ,
    NSLayoutAttributeCenterYWithinMargins ,
    // 无属性
    NSLayoutAttributeNotAnAttribute = 0

VFL代码模式,创建多个约束,需要分别创建vfl字符串,多次调用.

   //包装数字为NSNumber对象
   NSNumber *margin = @20;
   //定义VFL字符串
   NSString *vfl = @"H:|-margin-[button(width)]-margin-[textField(width)]-margin-|";
   //告诉vfl1中button是哪个控件,有多个参数用逗号隔开
   NSDictionary *views = @{@"button":button,@"textField":textField};
   //与上句等价,可写替代上句节约时间
   NSDictionary *views1 = NSDictionaryOfVariableBindings(button,textField);
   //告诉vfl中margin是哪个参数值,有多个参数用逗号隔开
   NSDictionary *metrics1 = NSDictionaryOfVariableBindings(margin);
   // 创建约束,返回值为数组
   NSArray *heightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl1 options:kNilOptions metrics:metrics1 views:views1];
   //添加数组约束
   [self.view addConstraints:heightConstraints];

VFL模式的方法参数如下:

+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(nullable NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *, id> *)views;
format:vfl字符串
options:对齐样式(不用可传kNilOptions)
metrics:变量参数(包装成字典对象传入)
views:需要设置约束的view(包装成字典对象传入)
VFL模式比纯代码实现AutoLayout方式能节约少许代码.开发中推荐使用第三方框架Masonry.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容