约束布局之旅—1

作者: osbornZ | 来源:发表于2017-05-29 15:44 被阅读48次

    约束方式

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

        本文链接:https://www.haomeiwen.com/subject/fwokfxtx.html