如何在 iOS 中标记约束和视图以从视觉调试器的混乱中获得任何意义

How do I label a constraint and a view in iOS to make any sense out of the visual debugger mess

coinsRightToSuperviewConstraint?.label = "coins2superview"

提示“由于内部保护级别,标签无法访问。

是否只能在xib编辑器中给视图和约束命名 任何意义或可视化调试器中的视图约束迷宫?

您可以添加 identifier 而不是 label:

coinsRightToSuperviewConstraint?.identifier = "coins2superview"

不太清楚你要做什么,但这里有一个例子显示了在约束上设置 .identifier

class ConstraintIDViewController: UIViewController {
    
    let label = UILabel()
    var labelTopConstraint: NSLayoutConstraint!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "Testing"
        label.backgroundColor = .cyan
        
        view.addSubview(label)
        
        let g = view.safeAreaLayoutGuide
        
        labelTopConstraint = label.topAnchor.constraint(equalTo: g.topAnchor, constant: 40.0)
        labelTopConstraint.identifier = "LabelTopID"
        
        NSLayoutConstraint.activate([
            labelTopConstraint,
            label.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
            label.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0),
        ])
        
        
        view.constraints.forEach { c in
            if c.identifier == "LabelTopID" {
                print("found constraint:", c)
            }
        }

    }
    
}

调试控制台输出为:

found constraint: <NSLayoutConstraint:0x6000036dc870 'LabelTopID' UILabel:0x7fd404d09770.top == UILayoutGuide:0x600002cc01c0'UIViewSafeAreaLayoutGuide'.top + 40   (active)>

并且调试视图层次结构显示:

Is it only possible to give views and constrains names in xib editor to make any sense or the view constraint maze in visual debugger?

这不仅是可能的,而且是必不可少的。

让我们从观点开始。您可以在 Interface Builder 中设置视图的“标签”:

您在此处输入的值用于 Interface Builder 的“文档浏览器”。

但是在代码调试时这对你没有帮助。为此,这里有一个扩展,它提供了一个视图 name 属性:

extension UIView {
    @IBInspectable var name : String? {
        get { return self.layer.name }
        set { self.layer.name = newValue }
    }
}

这是一个可检查的 属性,因此它显示在 Interface Builder 中。

现在让我们谈谈约束。如果你在代码中做一个约束,你可能会调用 activate ;这是一个扩展程序,可让您在当时添加标识符:

extension NSLayoutConstraint {
    func activate(withIdentifier id: String) {
        (self.identifier, self.isActive) = (id, true)
    }
}

如果您在 Interface Builder 中创建约束,则约束的标识符已经可以直接使用:

最后,不要忘记视图调试器。这是弄清楚发生了什么的重要方法。