AutoLayout 中的约束计数始终为零 ( 0 ) - iOS
Constrains count is always getting zero ( 0 ) in AutoLayout - iOS
我遇到了一个奇怪的问题,我正在使用故事板对视图设置约束,如下所示:
但是如果我通过代码访问所有应用的约束,那么总是得到零 (0)。
对于 self.view 它正在返回约束,但对于黄色视图则为零。
供您参考,当调用 viewDidLoad 时,子视图尚未布局,这就是为什么计数为零将代码放入 viewDidLayoutSubviews
中,您将在那里得到约束
只需尝试打印 viewDidAppear
中的约束。在 viewDidLoad
方法中没有为视图加载约束,只需在 viewDidAppear
方法中尝试。
使用此代码(Swift 4+ 和 Xcode 9.4.1)
import UIKit
class ViewController: UIViewController {
@IBOutlet var subView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
print(self.view.getAllConstraints().count)
print(self.subView.getAllConstraints().count)
}
}
extension UIView {
func getAllConstraints() -> [NSLayoutConstraint] {
var views = [self]
var view = self
while let superview = view.superview {
views.append(superview)
view = superview
}
return views.flatMap({ [=10=].constraints }).filter { constraint in
return constraint.firstItem as? UIView == self ||
constraint.secondItem as? UIView == self
}
}
}
我遇到了一个奇怪的问题,我正在使用故事板对视图设置约束,如下所示:
但是如果我通过代码访问所有应用的约束,那么总是得到零 (0)。
对于 self.view 它正在返回约束,但对于黄色视图则为零。
供您参考,当调用 viewDidLoad 时,子视图尚未布局,这就是为什么计数为零将代码放入 viewDidLayoutSubviews
中,您将在那里得到约束
只需尝试打印 viewDidAppear
中的约束。在 viewDidLoad
方法中没有为视图加载约束,只需在 viewDidAppear
方法中尝试。
使用此代码(Swift 4+ 和 Xcode 9.4.1)
import UIKit
class ViewController: UIViewController {
@IBOutlet var subView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
print(self.view.getAllConstraints().count)
print(self.subView.getAllConstraints().count)
}
}
extension UIView {
func getAllConstraints() -> [NSLayoutConstraint] {
var views = [self]
var view = self
while let superview = view.superview {
views.append(superview)
view = superview
}
return views.flatMap({ [=10=].constraints }).filter { constraint in
return constraint.firstItem as? UIView == self ||
constraint.secondItem as? UIView == self
}
}
}