NSLayoutConstraint 在 iOS 11 中已弃用的代码和底部布局指南中定义

Posted

技术标签:

【中文标题】NSLayoutConstraint 在 iOS 11 中已弃用的代码和底部布局指南中定义【英文标题】:NSLayoutConstraint defined in code and bottom Layout Guide deprecated in iOS 11 【发布时间】:2019-02-23 16:46:25 【问题描述】:

我有一个 viewController 持有这样的约束:

self.subviewConstraint = NSLayoutConstraint(item: self.subviewConstraint,
                                                     attribute: .bottom,
                                                     relatedBy: .equal,
                                                     toItem: self.bottomLayoutGuide,
                                                     attribute: .bottom,
                                                     multiplier: 1,
                                                     constant: 0)

我看到了这个警告:

'bottomLayoutGuide' 在 ios 11.0 中已弃用:使用 view.safeAreaLayoutGuide.bottomAnchor 代替 bottomLayoutGuide.topAnchor

我只是在寻找设置锚点的示例,而不是像这样的 NSLayoutConstraints,我不完全理解这个警告......“使用 view.safeAreaLayoutGuide.bottomAnchor 而不是 bottomLayoutGuide .topAnchor”? safeAreaLayoutGuide 的底部锚点如何与 bottomLayoutGuide 的顶部锚点匹配?我在哪里可以找到一个很好的图形解释? 我应该如何正确重写我的约束以保持其当前行为?

【问题讨论】:

【参考方案1】:

TopLayoutGuidebottomLayoutGuideiOS 11 起已弃用

您可以利用新的 NSLayoutAnchor 来更新您的代码:

self.subviewConstraint = self.subviewConstraint?.firstItem?.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)

或者您可以在您的问题中使用 NSLayoutConstraint 的初始化程序:

self.subviewConstraint = NSLayoutConstraint(item: self.subviewConstraint?.firstItem as Any,
                                                    attribute: .bottom,
                                                    relatedBy: .equal,
                                                    toItem: view.safeAreaLayoutGuide,
                                                    attribute: .bottom,
                                                    multiplier: 1,
                                                    constant: 0)

请注意,我已在 NSLayoutConstraint 初始化方法中将您的 self.subviewConstraint 参数更改为 self.subviewConstraint.firstItem,因为您使用 NSLayoutConstraint 作为项目。 我想这是你犯的某种错字。

您可以在此处找到关于 iOS 11 及更高版本中新的 SafeArea 行为的一些很好的图形说明: iOS Safe Area - Medium.com

另外,您说“我只是在寻找设置锚点而不是 NSLayoutConstraints 的示例”,但我想明确指出 NSLayoutAnchor 的 constraint(equalTo:) 方法 返回一个 NSLayoutConstraint。 (Apple NSLayoutAnchor documentation)

【讨论】:

以上是关于NSLayoutConstraint 在 iOS 11 中已弃用的代码和底部布局指南中定义的主要内容,如果未能解决你的问题,请参考以下文章

iOS7中的NSLayoutConstraint动画持续时间

在 iOS7 中设置 NSLayoutConstraint 常量

NSLayoutConstraint 在 iOS 11 中已弃用的代码和底部布局指南中定义

iOS开发NSLayoutConstraint代码自动布局

如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值

iOS原生自动布局NSLayoutConstraint