Я пытаюсь использовать автоматическую компоновку программно по языку визуального формата на представлении, которое находится на раскадровке, но не выполнено. Код, как показано ниже: (Btw, раскадровка, который показывает bView не важна, так что я не загрузить картинку раскадровки, и я не сделал установку любого ограничить на раскадровке..)Каким образом можно просматривать макет, который находится на раскадровке программно?
class ViewController: UIViewController {
@IBOutlet var bView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
bView.translatesAutoresizingMaskIntoConstraints = false
var allConstraints = [NSLayoutConstraint]()
let vC = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView])
let hC = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView])
allConstraints += vC
allConstraints += hC
NSLayoutConstraint.activateConstraints(allConstraints)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}
}
Но когда это выполняет, он показывает сообщение об ошибке:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: Unable to interpret '|' character, because the related view doesn't have a superview V:|-[bView]-| ^'
Я думаю, может быть, SuperView (вид на ViewController) сделал добавить на MainWindow. Поэтому я попытался исправить эту проблему, переместив код на viewWillLayoutSubviews(). Как ниже:
class ViewController: UIViewController {
@IBOutlet var bView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
bView.translatesAutoresizingMaskIntoConstraints = false
var allConstraints = [NSLayoutConstraint]()
let vC = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView])
let hC = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[bView]-|", options: [], metrics: nil, views: ["bView":bView])
allConstraints += vC
allConstraints += hC
NSLayoutConstraint.activateConstraints(allConstraints)
}
}
Тогда это показывает действительно смешной неправильный результат.
Итак, как я макет вид, который находится на раскадровке программно?
Более того, есть забавный результат, как это: (Это не связано с вопросом непосредственно, но вы можете попробовать это для удовольствия!)
С кодом:
class ViewController: UIViewController {
@IBOutlet var bView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
bView.translatesAutoresizingMaskIntoConstraints = false
}
}
Предполагается, что bView должен быть синим или белым фоном? – vacawama