如何修复 - safeAreaLayoutGuide' 仅适用于 iOS 11.0 或更高版本

Posted

技术标签:

【中文标题】如何修复 - safeAreaLayoutGuide\' 仅适用于 iOS 11.0 或更高版本【英文标题】:How to fix - safeAreaLayoutGuide' is only available on iOS 11.0 or newer如何修复 - safeAreaLayoutGuide' 仅适用于 iOS 11.0 或更高版本 【发布时间】:2018-01-22 21:02:55 【问题描述】:

在我的应用程序中出现此错误 -

safeAreaLayoutGuide' is only available on ios 11.0 or newer

在此代码中,错误出现了 3 次。基本上在我使用 safeArea 的每一行中。

NSLayoutConstraint.activate([
        stackViewBottomConstrols.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
        stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
        stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50)
        ])

我可以检查IOS 11 是否可用并运行此代码并在else 语句中添加另一个代码,使用相同的代码但没有safeArea。这是否会显示与if 语句中相同的视图。如果没有,还有其他解决方案吗?

此代码可以在没有 IOS 11 的设备上运行吗? -

        if #available(iOS 11.0, *) 
        NSLayoutConstraint.activate([
            stackViewBottomConstrols.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50)
            ])
     else 
        NSLayoutConstraint.activate([
            stackViewBottomConstrols.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50)
            ])
    

【问题讨论】:

见Safe Area Layout Guide。您是否也使用过 Storyboards...然后它会巧妙地更改 iOS 11 safeAreaLayoutGuide.top 和 iOStopLayoutGuide.bottomAnchor 之间的值。如果您不使用情节提要并自己做,那么您必须检查 iOS 版本,然后使用 #available 提供适当的代码。如需更全面的分析,请参阅this question 【参考方案1】:

safeAreaLayoutGuide 只是顶部、底部布局指南的替代品,并添加了前导、尾随 - 当然你的代码很好,这是在代码中创建约束以支持的唯一方法IOS 11 及更低版本,但仅用于切换无关紧要的约束

stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50)

变成这样

if #available(iOS 11.0, *) 
    NSLayoutConstraint.activate([
        stackViewBottomConstrols.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
        stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor)
     ])
 else 
    NSLayoutConstraint.activate([
        stackViewBottomConstrols.bottomAnchor.constraint(equalTo: self.bottomLayoutGuide.topAnchor),
        stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.trailingAnchor)
     ])
      

【讨论】:

哦,好吧,所以我需要添加一行代码——例如上面的 if 语句 stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50) 是的,不需要切换并在else中寻找bottomAnchor变化 我现在收到此错误 - 您的目标是 iOS 10.0,但只能从 iOS 11.0 及更高版本中的资产目录访问命名颜色。颜色显示正常,但如果设备低于 IOS 11,它们不会显示。你能帮我吗? 仅在 iOS 11 + 中命名颜色,因此要么提高部署目标,要么用#available 包围它们,然后在 11 之前尝试另一种替代方式【参考方案2】:

如果您希望尽可能保持一致,请在 pre-iOS-11 块中,将 view.bottomAnchor 替换为 bottomLayoutGuide.topAnchor。在 iOS 11 之前,仍然有 topLayoutGuidebottomLayoutGuide 帮助程序员考虑导航栏、标签栏等。否则,我觉得很好!

编辑:结果代码:

if #available(iOS 11.0, *) 
    NSLayoutConstraint.activate([
        stackViewBottomConstrols.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
        stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
        ])
 else 
    NSLayoutConstraint.activate([
        stackViewBottomConstrols.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor),
        stackViewBottomConstrols.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        stackViewBottomConstrols.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        ])

// This one doesn't care which iOS version it is
stackViewBottomConstrols.heightAnchor.constraint(equalToConstant: 50)

【讨论】:

看起来像是一个公认的答案。那么我需要实现的完整代码是什么样的呢?不太明白。 编辑了我的答案以添加它。 我现在收到此错误 - 您的目标是 iOS 10.0,但只能从 iOS 11.0 及更高版本中的资产目录访问命名颜色。颜色显示正常,但如果设备小于 IOS 11,它们不会显示。你能帮帮我吗? ——

以上是关于如何修复 - safeAreaLayoutGuide' 仅适用于 iOS 11.0 或更高版本的主要内容,如果未能解决你的问题,请参考以下文章

safeAreaLayoutGuide - 横向模式

旋转设备后 safeAreaLayoutGuide 未更新

safeAreaLayoutGuide - 横向模式

safeAreaLayoutGuide 不适用于 systemLayoutSizeFittingSize

NSLayoutConstraint 和 safeAreaLayoutGuide - 编码兼容 pre-iOS 11

在 Snapkit 中,tableViewController 上的 safeAreaLayoutGuide 不起作用