XCode问题:代码莫名新增NSLayoutConstraint且出现约束冲突
这种约束冲突我之前踩过好几次坑,虽然你手动设置了子视图和父视图四边constant=0、multiplier=1的约束,但系统或XIB很可能偷偷加了额外的互斥约束,给你几个实用的排查和解决方向:
1. 先扒完整的约束冲突日志
你只贴了提示开头,完整的日志会明确列出哪两个/几个约束在打架,比如会出现类似这样的内容:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
<列出具体冲突的约束内容>
重点看日志里有没有NSAutoresizingMaskLayoutConstraints——这是系统自动生成的约束,当子视图的translatesAutoresizingMaskIntoConstraints属性为YES时,系统会根据视图的frame和autoresizingMask自动生成约束,和你手动加的四边0约束直接冲突。
2. 检查XIB里的自动转约束开关
选中你的子视图,打开右侧的Attributes Inspector,找到Autoresizing选项,把里面的所有箭头都取消(也就是让autoresizingMask变成UIViewAutoresizingNone)。这一步会自动把translatesAutoresizingMaskIntoConstraints设为NO,阻止系统生成多余约束。
3. 排查XIB里的重复约束
有时候在XIB里拖拽约束时会不小心重复添加,比如同一个顶部边拖了两次约束。你可以打开XIB的Document Outline,展开子视图的Constraints节点,看看有没有重复命名的约束(比如两个“Top Space to Superview”),删掉多余的那个就行。
4. 用XIB自带的约束检查工具
点击XIB界面右下角的小锤子图标(Resolve Auto Layout Issues),选择Check for Auto Layout Issues -> All Views in View Controller,XIB会直接标出有问题的约束,点击红色警告就能看到冲突详情,甚至可以直接用工具帮你修复。
最后记得修改后清理项目缓存(Command+Shift+K)再重新运行,有时候旧的约束缓存会导致问题残留。
内容的提问来源于stack exchange,提问作者PruitIgoe

