约束方式
只有iPhone4的时候,我们可以在代码里将没一个可视单元的位置写死,这样是没问题的,但随着iPhone5、6的发布;布局情况就越来越微妙,苹果也是持续在优化整合更新约束布局方式。
-
Autoresizing属性,仅能调整视图变化相对于父类进行适配,对于兄弟关系无法处理;
-
Autolayout iOS-6之后;
能够让我们对任一元素在屏幕下有着唯一的位置约束即绝对定位,严格意义是能够唯一确定其位置约束、大小尺寸;VFL(Visual Format Language)方便书写; Masonry
UIView (UIConstraintBasedCompatibility)
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints
When you elect to position the view using auto layout by adding your own constraints, you must set this property to NO. IB will do this for you.
-
SizeClass iOS8中新增的,对应xcode 6.0;扩展了3*3种不同的组合界面,方便我们对不同尺寸布局在一个地方集中完成, 类似于 UIButton的不同状态设置( Default、selected、highlight);
-
而xcode 8.0则删除了 SizeClass,对应iOS 10,取而代之的是 trait variations ,主要是进行特征划分和对应设备的自定义布局;
-
UIStackView 也是相对于布局产生的UI控件,Stack View最有用的就是它会自动为每个subview创建和添加Auto Layout constraints。当然你可以控制subview的大小和位置。可以通过选项配置subview的大小、排布以及彼此间的间距。
调试
Symbolic Breakpoint: UIViewAlertForUnsatisfiableConstraints
- 打开断点导航(cmd+7)
- 点击左下角的+按钮
- 选择Add Symbolic Breakpoint
- 在Symbol添加UIViewAlertForUnsatisfiableConstraints; Action 添加__"po [[UIWindow keyWindow] autolayoutTrace]"或 "expr -l objc++ -O -- [[UIWindow keyWindow] autolayoutTrace]"(Swift) 或者LLDB 调试找到 AMBIGUOUS 点。
大家应该都有碰到取到的视图为1000*1000的。主要问题是在View的 awakeFromNib,或者VC的viewDidLoad,获取当前视图的frame或者bounds的size布局会导致界面异常。
解决方案:
- 全部用autolayout布局,不取frame或者bounds
- awakeFromNib,或者viewDidLoad要使用frame或者bounds前,先调用视图的layoutIfNeeded。这个要注意,有发现viewDidLoad调用后,取到的frame的origin还是错误的,不过size是对的.
- 在View的layoutSubviews或者VC的 viewDidLayoutSubviews再去获取当前视图的frame或者bounds布局
网友评论