ios - 为什么 NSLayoutConstraint 的标识符属性在代码中不起作用?
问题描述
我正在尝试编写一些不添加两次相同约束的条件。例如,如果一个视图已经有一个底部锚约束,请不要再次添加它。所以我尝试使用布局约束标识符来唯一标识一个约束,这样如果它已经存在就不要再添加另一个约束了。我没有故事板,所以我编写了以下代码:
class PDFViewer: UIViewController {
var quickLookController = QLPreviewController()
override func viewDidLoad()
if let quickView = quickLookController.view {
self.view.addSubview(quickView)
}
{
quickLookController.view.translatesAutoresizingMaskIntoConstraints = false
quickLookController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
quickLookController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
quickLookController.view.topAnchor.constraint(equalTo: navView.bottomAnchor).isActive = true
setPDFViewHeight(height: 100)
setPDFViewHeight(height: 100)
}
open func setPDFViewHeight(height: CGFloat) {
var isBottomAnchorSet = false
if let superView = quickLookController.view.superview {
for constraints in superView.constraints {
if constraints.identifier == "bottom" {
isBottomAnchorSet = true
}
else {
print(false)
}
}
}
if !isBottomAnchorSet {
quickLookController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).identifier = "bottom"
quickLookController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
}
}
但是两次我都调用setPDFViewHeight
方法它说没有命名标识符"bottom"
,但它应该是第二次。我也尝试直接获得超级视图的约束,如下所示,但也存在同样的问题。
for constraints in view.constraints {
if constraints.identifier == "bottom" {
isBottomAnchorSet = true
}
}
我在做什么错或不能以这种方式使用此标识符?
即使是关于如何避免重复布局约束的完全不同的答案也会有所帮助。提前致谢。
解决方案
我认为在您的情况下,最好保持底部约束并稍后在需要时更新常量,如下所示:
class PDFViewer: UIViewController {
var quickLookController = QLPreviewController()
var bottomConstraint: NSLayoutConstraint?
override func viewDidLoad()
if let quickView = quickLookController.view {
self.view.addSubview(quickView)
}
quickLookController.view.translatesAutoresizingMaskIntoConstraints = false
bottomConstraint = quickLookController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
NSLayoutConstraint.activate([
quickLookController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
quickLookController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
quickLookController.view.topAnchor.constraint(equalTo: navView.bottomAnchor),
bottomConstraint
])
setPDFViewHeight(height: 100)
setPDFViewHeight(height: 100)
open func setPDFViewHeight(height: CGFloat) {
bottomConstraint.constant = height
}
}
此外,它的命名setPDFViewHeight
可能会产生误导,因为它真正做的是设置与锚点的偏移量,而不是绝对高度。
推荐阅读
- json - 目标 C 字符串到 JSON 格式
- mysql - MySQL 获取列中的所有子项
- javascript - 我如何从用户那里获取输入报价并将其打乱,然后将每个字母分开放在 JavaScript 的表格中
- c++ - 如何在 C++ 中的 Linux 下使用特殊字符(ä、ö、ß)?此代码在 Windows 上运行良好
- mysql - 减少mysql中的连接数
- android - 将 Firebase 数据保存到设备
- google-colaboratory - 在 TPU 上训练时验证损失变为 nan 但在 GPU 上完全没问题
- android - 此过程中未初始化默认 FirebaseApp - React Native - 本地通知
- typescript - TypeScript - 字符串键接口的属性不作为字符串类型传递
- python - 拖放 gtk 文本视图