美文网首页
备忘录之-解决Autolayout约束冲突

备忘录之-解决Autolayout约束冲突

作者: 忧郁的小码仔 | 来源:发表于2019-05-08 18:31 被阅读0次

    有时候,我们在把玩App的时候,会经常看到在控制台上打印约束相关的一些日志信息,就像下面这样:


    约束冲突

    虽然,最终我们的App页面好像也没有出现什么问题,但是,我们应该意识到我们在设置页面约束的时候是存在问题的,只不过是系统自动帮我们把冲突恢复了而已,总之,如果你像我一样有代码洁癖,就一定会尝试去解决处理它。

    最主要的是要在这一堆信息中找出是哪个View的约束有问题,这看着就让人头大,不要紧,只需要记住几条命令,你就可以轻松解决这个问题了。
    首先,在问题页面的viewDidAppear()里面打个断点,然后

    OC:

    po [[UIWindow keyWindow] _autolayoutTrace]
    

    Swift:

    expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]
    

    就是这两条命令,子如其人,看名字就知道他们要做什么了。好了,执行一下吧:

    视图树

    好了,视图层级,以及每个View的地址都有了,再看看我们一开始得到的约束日志,里面最重要的一行:

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x28327c960 UIView:0x102b070f0.height == 200   (active)>
    

    这个就是问题约束,以及View的地址,到上面视图树里搜一下0x102b070f0这个地址,再根据视图树你就大概能找到问题View了,如果你的视图比较多,那也没有问题,给View重新换个亮瞎你的狗眼的颜色,让他一秒钟现身:

    OC:

    expression ((UIView *)0x159e11730).backgroundColor = [UIColor redColor]
    expression [CATransaction flush]
    

    Swift:

    expression unsafeBitCast(0x101618330, to: UIView.self).backgroundColor = UIColor.red
    expression CATransaction.flush()
    

    不要告诉我你已经忘记expression可以来动态修改对象属性了💩。

    另外,就像日志中提到的那样,我们可以自己加一个symbolic breakpoint,像下面这样:

    UIViewAlertForUnsatisfiableConstraints symbolic breakpoint

    再碰到约束冲突的时候就会自动da yin

    相关文章

      网友评论

          本文标题:备忘录之-解决Autolayout约束冲突

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