约束布局之旅—1

约束方式

只有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

  1. 打开断点导航(cmd+7)
  2. 点击左下角的+按钮
  3. 选择Add Symbolic Breakpoint
  4. 在Symbol添加UIViewAlertForUnsatisfiableConstraints; Action 添加__"po [[UIWindow keyWindow] autolayoutTrace]"或 "expr -l objc++ -O -- [[UIWindow keyWindow] autolayoutTrace]"(Swift) 或者LLDB 调试找到 AMBIGUOUS 点。

iOS10 约束问题

大家应该都有碰到取到的视图为1000*1000的。主要问题是在View的 awakeFromNib,或者VC的viewDidLoad,获取当前视图的frame或者bounds的size布局会导致界面异常。

解决方案:

  1. 全部用autolayout布局,不取frame或者bounds
  2. awakeFromNib,或者viewDidLoad要使用frame或者bounds前,先调用视图的layoutIfNeeded。这个要注意,有发现viewDidLoad调用后,取到的frame的origin还是错误的,不过size是对的.
  3. 在View的layoutSubviews或者VC的 viewDidLayoutSubviews再去获取当前视图的frame或者bounds布局

你可能感兴趣的:(约束布局之旅—1)