如何在 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 中创建约束,则约束的标识符已经可以直接使用:
最后,不要忘记视图调试器。这是弄清楚发生了什么的重要方法。
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 中创建约束,则约束的标识符已经可以直接使用:
最后,不要忘记视图调试器。这是弄清楚发生了什么的重要方法。