【问题标题】:Layout attributes relative to the layout margin on iOS versions prior to 8.0在 8.0 之前的 iOS 版本上相对于布局边距的布局属性
【发布时间】:2026-02-14 20:10:01
【问题描述】:

什么会导致以下警告(以及 iOS 7 上的后续对齐问题)?

属性不可用:布局属性相对于 iOS 8.0 之前版本的布局边距

【问题讨论】:

    标签: ios autolayout


    【解决方案1】:

    禁用“首选边距相对”

    【讨论】:

    • 每次我查看我在此 Pin 图上的约束时,都会勾选 Prefer margin relative 复选框(iOS beta 5,Xcode beta 6)。我发现仅取消勾选它是不够的,但必须删除在偏好边距相对下创建的任何约束,并使用此弹出窗口重新创建它们,并取消勾选复选框。它仍然默认将它们显示为 Prefer margin relative,但只要它们是在关闭它的情况下创建的,我的布局似乎工作正常(而不是完全搞砸)。我通常通过 ctrl 拖动来创建约束,但发现这根本不适合我。
    • 我已经找到了this,它提供了一种更简单的方法来编辑这些内容而无需删除和重新创建它们
    • 如果你通过ctrl-draging创建约束,注意如果在弹出的浮动菜单显示的时候按住Option,它会切换是否约束到边距(你会看到菜单中的描述更改。)如果您不想更改整体设置或稍后编辑它们,这可能会有所帮助。
    • 有人能解释一下相对于容器相对于容器边距的区别吗?
    • 如果您需要一种快速的方法来查找所有设置了相对边距的约束,请在左侧面板中打开所有约束,然后打开检查器面板。那些与边距相关的约束将在约束描述中包含它 - 即“titleLabel.leading Margin”而不是“titleLabel.leading”
    【解决方案2】:

    取消选中“首选保证金相对”复选框将使您不会陷入收到此警告的情况。

    如果您像我一样,并且在意识到问题之前构建了一个带有约束的整个应用程序,那么事情就有点困难了,因为 Xcode 不会轻易告诉您哪些约束是问题。

    为了避免重新构建我的所有约束,我求助于查看实际的 .storyboard 文件并寻找如下约束:

    <constraint firstItem="vId-..." firstAttribute="top" secondItem="In7-..." secondAttribute="topMargin" id="C0H-..."/>
    

    注意“topMargin”。以“Margin”结尾的属性会导致警告。我以这种方式检查并确定了文件中的约束,然后我在 IB 中删除并重新创建了它们。之后,这个警告就消失了。

    我怀疑这也应该解决 iOS 7 和 iOS 8 约束处理之间的一些不一致,尽管我仍然遇到一些行为差异,即使在解决了所有 Xcode 警告之后。

    【讨论】:

    • 这对我很有帮助。
    • 我收到了一些警告实例,但在我的故事板源文件中找不到字符串“Margin”。 Grr。从头开始!我在错误的项目窗口中。
    • 噢!在阅读您的答案之前,我自己弄清楚了这一点!本来可以节省一些时间的。无论如何,是的,这是定位违规约束的好方法。
    【解决方案3】:

    发布的答案都没有为我解决问题。但原因如下:Xcode 6 默认基于相对边距创建约束。这些仅适用于 iOS 8.0 和更新版本。当您的部署目标设置为 iOS 7.0 或更低版本时,您会收到这些警告。

    我修复警告的方式:

    • 点击 Xcode 中的警告
    • 属性检查器将打开约束
    • 搜索有边距的项目(见截图)
    • 关闭相对于边距选项

    【讨论】:

    • 如果关闭自动布局,为什么我会得到这些?
    • @RubberDuck 有。
    • 重启XCode 6的属性检查器没有打开
    • 删除边距约束后,我仍然收到 Xcode 警告,但不知道原因。重新启动 Xcode,它们就消失了。叹息。
    • 关闭它,然后不知何故又神秘地回来了。有没有办法全局禁用它?
    【解决方案4】:

    我目前的情况与我在 Xcode 6 中创建一个针对 iOS7 和 8 的应用程序相同。出现该警告是因为相对于边距的约束在 iOS7 中不可用,但它们是默认创建的在 Xcode 6 中。

    您绝对可以返回并编辑约束以不使用该问题的其他答案所建议的“相对于边距”功能。

    在创建新约束时,我在选择要创建的约束类型时按住 Option 键。这使我能够立即创建不基于边距的约束,因此我不必在之后返回并修复它。

    【讨论】:

    • 感谢 Option 关键技巧!不知道,我一直想知道如何添加除建议之外的其他约束。
    • 按住选项然后点击哪里?它不适合我。
    【解决方案5】:

    我采用了非程序员的方法。

    我知道哪个视图控制器导致了 8.0 边距消息。所以,我去了我的约束列表。我有 33 个。我已经删除了导致 8.0 边距消息的每一个。我降到了 20(所以 11 是问题)。

    选择 32 over 33 delete 并查看结果。选择 31 超过 33 删除,依此类推......当消息仍然存在时......删除有问题的。

    所以我花了 5 分钟来解决错误消息。

    确实出现了其他约束消息,但这没什么大不了的。

    好吧,重做并逐步解决约束消息,但这次检查您添加的所有约束是否不会引发 8.0 边距消息的重新出现。如果是这样,请在添加约束时撤消并采取其他策略。总有另一种方法可以添加有效的约束。

    这不是 Xcode 提出的,但它会完成这项工作。

    最后,大功告成

    如果您有多个视图控制器,并且不知道是哪一个导致了 8.0 边距消息,请尝试隔离每个视图控制器。可能在一个单独的测试项目中,复制并粘贴或删除除一个之外的所有其他视图并查看结果。

    如果出现问题,使用文件菜单中的“创建快照”可以帮助您。

    【讨论】:

    • 更简单的方法是右键单击 Xcode 中的情节提要并选择 Open As > Source Code。然后只需搜索“边距”并删除任何引用边距的约束。删除后,打开为 > IB Storyboard 并修复任何缺失的约束。
    • 请注意,在您删除违规约束后,该错误可能会继续显示在 Xcode 中。所以如果你找不到'margin'这个词,你应该退出并重新启动Xcode。我不会说这让我绊倒了多少次!
    【解决方案6】:

    抑制警告:我检查了所有 IB 约束并删除了所有“第一基线...”。这使得所有这些警告都消失了。但是,如果您“添加缺少的约束”或“重置为建议的约束”,IB 将重新引入警告。

    可能的原因:从一个新的 Xcode 6.1 项目中,我使用“重置为建议的约束”(懒惰地)在 Storyboard 中复制/粘贴了 ViewController。然后将项目目标从 8.0 更改为 7.1。这导致弹出警告。我注意到警告只出现在我的某些 ViewController 上,我相信这些是我在 Storyboard 中复制/粘贴的。

    建议:如果目标是 7.1,请在使用 IB 之前进行设置。不要在 Storyboard 中复制/粘贴视图控制器。在 IB 工作时要警惕“新警告”,希望我们能确认造成这种烦恼的原因。

    【讨论】:

    • 当这里的问题是关于“相对于布局边距的属性”时,为什么要谈论“第一基线”?这是一个不同的错误,尽管原因和解决方法相似。
    • 澄清一下,我收到的错误是:“属性不可用:8.0 之前的 iOS 版本上的第一个基线布局属性”。也许这个问题值得拥有自己的话题..
    • 我遇到了同样的“第一基线”问题。这是一个类似的修复程序,但我为它添加了一个新问题,因为谷歌只把我带到了这里。 *.com/questions/27557692/…
    【解决方案7】:

    Xcode 6 默认基于相对边距创建约束。

    所以,如果你想强制删除所有基线属性,又不想在 Interface Buidler 中搜索所有不好的约束,以支持 iOS 7,我可以推荐这种方式

    要查找并删除约束中带有“基线”的所有虚拟字符串,您可以这样做:

    1. 关闭 Xcode
    2. 在您喜欢的支持正则表达式的文本编辑器中打开您的 stroyboard 文件。
    3. 按模式查找并从情节提要文件中删除所有字符串:.*"baseline".*\n
    4. 现在保存文件并在 Xcode 中打开它
    5. 修复所有出现的错位:找到所有警告并按“更新所有视图的约束”以保存所有视图的原始位置。
    6. 利润!

    统一更新: 我发现“基线”约束也会导致崩溃,但 Xcode 没有显示任何关于这些约束的警告!

    修复它 - 按模式从情节提要文件中删除所有字符串:.*"baseline".*\n

    【讨论】: