Autoresizing
一个在AutoLayout之前处理布局的技术 处理的层面为父子层面的控件 和Autolayout不兼容
基本实现
xib
和storyboard
中使用Autoresizing
相对比较简单-
代码实现:
- (void)viewDidLoad { [super viewDidLoad]; UIView *blueView = [[UIView alloc] init]; blueView.backgroundColor = [UIColor blueColor]; blueView.frame = CGRectMake(0, 0, 250, 250); [self.view addSubview:blueView]; self.blueView = blueView; UIView *redView = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; redView.frame = CGRectMake(0, 150, 250, 100); redView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth; [blueView addSubview:redView];
}
- 常见的mask:
```objc
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 距离父控件左边的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleRightMargin = 1 << 2, 距离父控件右边的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleTopMargin = 1 << 3, 距离父控件顶部的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleBottomMargin = 1 << 5, 距离父控件底部的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleWidth = 1 << 1, 宽度跟随父控件的宽度进行自动伸缩
UIViewAutoresizingFlexibleHeight = 1 << 4, 高度跟随父控件的高度进行自动伸缩
Autolayout
- Autolayout用来处理父子和同级层面的问题
- 6.0推出,7.0火起来
- 核心概念:约束、参照
- 实现方式:
-
xib
和storyboard
中使用Autolayout
相对比较简单 -
NSLayoutConstraint
实现Autolayout
-
VFL
实现Autolayout
代码添加Autolayout
先禁止autoresizing功能
view.translatesAutoresizingMaskIntoConstraints = NO;
这句代码的作用是将view自带的一些autoresizing转换为AutoLayout的约束,可能会与自己添加的约束产生冲突等其他问题
为什么先添加到父控件上然后再添加约束?
因为有些约束需要添加到父控件上,如果没有父控件那就不知道该往哪里添加了,so crash
约束添加在哪个view上?
一般来说一个view的约束只要有具体数值机会可以而不需要和其他的view产生关联,那么这个约束就会添加到这个view上。比如view的宽和高约束
如果一个view的一些约束关联了父控件的一些值,那么这个约束会被添加到父控件上。比如view的左边和父控件的左边对齐
如果一个view和一个兄弟级别的view产生关联,那么约束会被添加到父控件身上。比如一个view和一个同级别的view的高度相等。但是如果他们没有共同的父控件,那么会添加到最近的父控件身上
NSLayoutConstraint的基本使用
obj1.property1 =(obj2.property2 * multiplier)+ constant value
+(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 :常量
//以上的约束在生成后一定要添加在对应的view身上
VFL - Visual Format Language
H:[cancelButton(72)]-12-[acceptButton(50)]
:canelButton
宽72,acceptButton
宽50,它们之间间距12H:[wideView(>=60@700)]
:wideView
宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)V:[redBox][yellowBox(==redBox)]
:竖直方向上,先有一个redBox
,其下方紧接一个高度等于redBox
高度的yellowBox
H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|
:水平方向上,Find
距离父view
左边缘默认间隔宽度,之后是FindNext
距离Find
间隔默认宽度;再之后是宽度不小于20的FindField
,它和FindNext
以及父view
右边缘的间距都是默认宽度。(竖线“|” 表示superview
的边缘)VFL的使用
//使用VFL来创建约束数组
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format
options:(NSLayoutFormatOptions)opts
metrics:(NSDictionary *)metrics
views:(NSDictionary *)views;
format :VFL语句
opts :约束类型
metrics :VFL语句中用到的具体数值
views :VFL语句中用到的控件
创建一个字典(内部包含`VFL`语句中用到的控件)的快捷宏定义 这个宏可以生成和对象同名的key的字典
NSDictionaryOfVariableBindings(...)
Autolayout的常见应用
label的Autolayout
label只要有位置就可以
label设置宽度,然后高度会根据文字自适应
有的时候在xib约束label的宽度,但是代码中设置的文字又不足以填满整个label,这个时候往往想文字有多宽label就有多宽,这个时候在设置label的宽度约束的时候不要设置等于某个值,而是设置小于等于某个值
一个控件的高度、宽度可以设置多个约束,比如可以设置小于等于100,大于等于50这样子
一个控件的Y值可以参照上面的view1和view2两个约束,为了避免冲突将距离view2的约束值的优先级改为750,假如view1被从父控件中移除,那么控件的Y值将会参照view2的那个约束
父控件的大小随着子控件的内容的大小变化而变化
在一个父控件的UIView设置除了高度以外的约束,然后添加子控件label,label设置除了高度以外的约束并且设置label的底部距离父控件的底部的距离是固定的,然后如果更改label的文字,那么label的高度会变化,父控件的高度也会变化
NSLayoutConstaints和VFL的使用
NSLayoutConstraints的使用 :NSLayoutConstraints 密码:vg9y
VFL的使用:VFL 密码:irrn