【发布时间】:2026-02-14 20:10:01
【问题描述】:
什么会导致以下警告(以及 iOS 7 上的后续对齐问题)?
属性不可用:布局属性相对于 iOS 8.0 之前版本的布局边距
【问题讨论】:
标签: ios autolayout
什么会导致以下警告(以及 iOS 7 上的后续对齐问题)?
属性不可用:布局属性相对于 iOS 8.0 之前版本的布局边距
【问题讨论】:
标签: ios autolayout
禁用“首选边距相对”
【讨论】:
取消选中“首选保证金相对”复选框将使您不会陷入收到此警告的情况。
如果您像我一样,并且在意识到问题之前构建了一个带有约束的整个应用程序,那么事情就有点困难了,因为 Xcode 不会轻易告诉您哪些约束是问题。
为了避免重新构建我的所有约束,我求助于查看实际的 .storyboard 文件并寻找如下约束:
<constraint firstItem="vId-..." firstAttribute="top" secondItem="In7-..." secondAttribute="topMargin" id="C0H-..."/>
注意“topMargin”。以“Margin”结尾的属性会导致警告。我以这种方式检查并确定了文件中的约束,然后我在 IB 中删除并重新创建了它们。之后,这个警告就消失了。
我怀疑这也应该解决 iOS 7 和 iOS 8 约束处理之间的一些不一致,尽管我仍然遇到一些行为差异,即使在解决了所有 Xcode 警告之后。
【讨论】:
发布的答案都没有为我解决问题。但原因如下:Xcode 6 默认基于相对边距创建约束。这些仅适用于 iOS 8.0 和更新版本。当您的部署目标设置为 iOS 7.0 或更低版本时,您会收到这些警告。
我修复警告的方式:
【讨论】:
我目前的情况与我在 Xcode 6 中创建一个针对 iOS7 和 8 的应用程序相同。出现该警告是因为相对于边距的约束在 iOS7 中不可用,但它们是默认创建的在 Xcode 6 中。
您绝对可以返回并编辑约束以不使用该问题的其他答案所建议的“相对于边距”功能。
在创建新约束时,我在选择要创建的约束类型时按住 Option 键。这使我能够立即创建不基于边距的约束,因此我不必在之后返回并修复它。
【讨论】:
我采用了非程序员的方法。
我知道哪个视图控制器导致了 8.0 边距消息。所以,我去了我的约束列表。我有 33 个。我已经删除了导致 8.0 边距消息的每一个。我降到了 20(所以 11 是问题)。
选择 32 over 33 delete 并查看结果。选择 31 超过 33 删除,依此类推......当消息仍然存在时......删除有问题的。
所以我花了 5 分钟来解决错误消息。
确实出现了其他约束消息,但这没什么大不了的。
好吧,重做并逐步解决约束消息,但这次检查您添加的所有约束是否不会引发 8.0 边距消息的重新出现。如果是这样,请在添加约束时撤消并采取其他策略。总有另一种方法可以添加有效的约束。
这不是 Xcode 提出的,但它会完成这项工作。
最后,大功告成。
如果您有多个视图控制器,并且不知道是哪一个导致了 8.0 边距消息,请尝试隔离每个视图控制器。可能在一个单独的测试项目中,复制并粘贴或删除除一个之外的所有其他视图并查看结果。
如果出现问题,使用文件菜单中的“创建快照”可以帮助您。
【讨论】:
抑制警告:我检查了所有 IB 约束并删除了所有“第一基线...”。这使得所有这些警告都消失了。但是,如果您“添加缺少的约束”或“重置为建议的约束”,IB 将重新引入警告。
可能的原因:从一个新的 Xcode 6.1 项目中,我使用“重置为建议的约束”(懒惰地)在 Storyboard 中复制/粘贴了 ViewController。然后将项目目标从 8.0 更改为 7.1。这导致弹出警告。我注意到警告只出现在我的某些 ViewController 上,我相信这些是我在 Storyboard 中复制/粘贴的。
建议:如果目标是 7.1,请在使用 IB 之前进行设置。不要在 Storyboard 中复制/粘贴视图控制器。在 IB 工作时要警惕“新警告”,希望我们能确认造成这种烦恼的原因。
【讨论】:
Xcode 6 默认基于相对边距创建约束。
所以,如果你想强制删除所有基线属性,又不想在 Interface Buidler 中搜索所有不好的约束,以支持 iOS 7,我可以推荐这种方式
.*"baseline".*\n
统一更新: 我发现“基线”约束也会导致崩溃,但 Xcode 没有显示任何关于这些约束的警告!
修复它 - 按模式从情节提要文件中删除所有字符串:.*"baseline".*\n
【讨论】: