现阶段对于自动布局来说,有一些很成熟的第三方框架,其中较为优秀的是 OC 有: SnapKit/Masonry 框架等. Swift 有: SnapKit/SnapKit 框架等.其本质上都是对 Apple 的 autolayout 的二次封装.提到 autolayout 就不得不提 autoresizing.
对于 autoresizing 需要注意的是 storyboard 中设置的约束和手码中设置的约束是相反的.
autoresizing 所体现的 autoresizingMasks 属性的枚举都是 flexible 可“伸缩”的, autoresizingMasks 的枚举一共有7个值:无/宽可伸缩/高可伸缩/左间距可伸缩/右间距可伸缩/上间距可伸缩/下间距可伸缩,对应的分别是:
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
每个枚举值都是位移枚举,可以在一行代码中传多个值。
有一个较为核心的思想提炼出来的一个公式,任何两个控件间的约束都可以通过这个公式算出:
obj1.property1 =(obj2.property2 * multiplier)+ constant value
multiplier 和 constant 就是向量系数和偏移量.
还有为了避免和系统生成的自动伸缩的约束不冲突一般加上这句代码:
view.translatesAutoresizingMaskIntoConstraints = NO;
translatesAutoresizingMaskIntoConstraints 属性系统默认这个属性是 YES.
约束改变添加动画注意事项:
由于约束的改变是瞬时操作,这和改变frame的动画的改变存在明显的差异,这里要把更新约束的代码放到动画的block里是无效的.从而必须要把约束写在外面,然后block里包裹 layoutIfNeed.
错误:
[UIView animateWithDuration:2.0 animations:^{
NSLayoutConstraint *width = [_constaints firstObject];
width.constant = 200;
}];
正确:
[UIView animateWithDuration:2.0 animations:^{
[self.view layoutIfNeeded];
}];