码迷,mamicode.com
首页 > 移动开发 > 详细

iOS自动布局

时间:2016-04-22 22:20:55      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

自动布局:

1.Autoresizing

   当UIView的autoresizesSubviews是YES时,(默认是YES), 那么在其中的子view会根据它自身的autoresizingMask属性来自动适应其与superView之间的位置和大小。注意: autoresizing只能设置当前控件与父控件之间的相对关系,可以进行屏幕适配

【autoresizingMask是子视图的左、右、上、下边距以及宽度和高度相对于父视图按比例变化,例如:

UIViewAutoresizingNone 不自动调整。

UIViewAutoresizingFlexibleLeftMargin 自动按比例调整与superView左边的距离,且与superView右边的距离不变。

UIViewAutoresizingFlexibleRightMargin 自动按比例调整与superView的右边距离,且与superView左边的距离不变。

UIViewAutoresizingFlexibleTopMargin  自动按比例调整与superView的顶部距离,且与superView底部的距离不变。

UIViewAutoresizingFlexibleBottomMargin 自动按比例调整与superView的底部距离,且与superView顶部的距离不变。

UIViewAutoresizingFlexibleWidth 自动按比例调整宽度。

UIViewAutoresizingFlexibleHeight 自动按比例调整高度。】

相关demo:UI基础day10-10自定义布局-代码-02-用代码实现autoresizing

2.Autolayout  (勾选Use Auto Layout)—>一般需要设置上下左右或上下宽高四个约束,特殊控件不一定必须4个约束

 随着iPhone发布苹果设备不同尺寸的屏幕变得越来越多, 不仅要求能根据控件父子关系来设置相对位置, 也要求能根据任意控件之间的关系来设置位置

因为 autoresizing只能设置当期控件与父控件之间的相对关系, 当遇到要设置兄弟控件之间的关系的时候 autoresizing就无能为力了,所以就需要Autolayout通过设置某控件与任意其他控件间的关系来决定如何显示这个控件, 不仅仅局限与父子控件

补充:【autolayout:不能满足设置一套约束,在所有的屏幕都适配,所以出现了sizeclass,size用来区分屏幕

sizeclass没有宽高:把宽高各分成了三种类型

regualr

compact

any

当宽度和高度各是某种类型的时候,就会确定某一类屏幕

所以确定九类屏幕,只是不屏幕进行了区分,具体的约束关系

还需要autolayout实现】

注意:autoresizing 和autolayout 二者是互斥的,同时只能使用其中一种,当使用autoresizing的时候必须禁用autolayout, 当使用autolayout的时候就无法使用Autoresizing了。

Autolayout当中有俩个核心概念:参照和约束

参照:通过参照其他控件或父控件来设置当前控件的位置和大小

约束Constraint(规则):通过添加约束限制控件的位置和大小

代码实现Autolayout的步骤

利用NSLayoutConstraint类创建具体的约束对象

添加约束对象到相应的view上

- (void)addConstraint:(NSLayoutConstraint *)constraint;

- (void)addConstraints:(NSArray *)constraints;

代码实现Autolayout的注意点

1》 要先禁止autoresizing功能,设置view的下面属性为NO

view.translatesAutoresizingMaskIntoConstraints = NO;

2》 添加约束之前,一定要保证相关控件都已经在各自的父控件上

3》不用再给view设置frame

了解内容,大部分都用SB来设置约束

【一个  《NSLayoutConstraint》  对象就代表一个约束

创建约束对象的常用方法

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

view1 :要约束的控件

attr1 :约束的类型(做怎样的约束)

relation :与参照控件之间的关系

view2 :参照的控件

attr2 :约束的类型(做怎样的约束)

multiplier :乘数

c :常量

例子:[NSLayoutConstraint constraintWithItem:view1

      attribute:NSLayoutAttributeTop

      relatedBy:NSLayoutRelationEqual

         toItem:superview

      attribute:NSLayoutAttributeTop

     multiplier:1.0

       constant:padding.top]

自动布局有个核心公式

obj1.property1 =(obj2.property2 * multiplier)+ constant value

框架:Masonry,“一个轻量级的布局框架,采用更"优雅"的语法封装自动布局”,不需要使用XIB和Storyboard, 并具有高可读性

方式一逐个设置 make.top.equalTo

方式二连续设置 make.top.left.bottom.and.right.equalTo

方式三一次性设置 make.edges.equalTo

例子:[view1 mas_makeConstraints:^(MASConstraintMaker *make) {

    make.edges.equalTo(superview).with.insets(padding);

}];

SnapKit:SnapKit是Masonry的Swift版 ,方法和Masonry类似

例子:view1.snp_makeConstraints { (make) -> Void in

    make.edges.equalTo(superview).insets(UIEdgeInsetsMake(10, 10, 10, 10))

}这句代码的意思是view1+UIEdgeInsetsMake(10, 10, 10, 10)的外边距=superView

//使用框架的步骤

//1.首先导入头文件

//2.在使用框架的地方,导入主要的.h文件

//3.使用框架不需要去掉autoresizing

iOS自动布局

标签:

原文地址:http://www.cnblogs.com/ansyxpf/p/5422893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!