有时候,我们在把玩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
,像下面这样:
再碰到约束冲突的时候就会自动da yin
网友评论