首页 > 解决方案 > 为什么 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
            }
        }

我在做什么错或不能以这种方式使用此标识符?

即使是关于如何避免重复布局约束的完全不同的答案也会有所帮助。提前致谢。

标签: iosswiftxcodenslayoutconstraint

解决方案


我认为在您的情况下,最好保持底部约束并稍后在需要时更新常量,如下所示:

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可能会产生误导,因为它真正做的是设置与锚点的偏移量,而不是绝对高度。


推荐阅读