У меня есть стек с двумя элементами управления.
Когда пользовательский интерфейс не имеет вертикальных ограничений: Вертикальный1
Когда пользовательский интерфейс имеет вертикальных ограничений: Горизонтальный1
Я получаю обаИнтерфейсы, как на картинке.Когда я показываю пользовательские интерфейсы в первый раз, нет конфликтов ограничений.Однако, когда я перехожу от вертикально ограниченного к вертикальному = обычному, я получаю конфликты ограничений.
Когда я закомментирую пространство стека (см. Комментарий к коду ниже), я не получу конфликт ограничений.
class ViewController: UIViewController {
var rootStack: UIStackView!
var aggregateStack: UIStackView!
var field1: UITextField!
var field2: UITextField!
var f1f2TrailTrail: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
createIntializeViews()
createInitializeAddStacks()
}
private func createIntializeViews() {
field1 = UITextField()
field2 = UITextField()
field1.text = "test 1"
field2.text = "test 2"
}
private func createInitializeAddStacks() {
rootStack = UIStackView()
aggregateStack = UIStackView()
// If I comment out the following, there are no constraint conflicts
aggregateStack.spacing = 2
aggregateStack.addArrangedSubview(field1)
aggregateStack.addArrangedSubview(field2)
rootStack.addArrangedSubview(aggregateStack)
view.addSubview(rootStack)
rootStack.translatesAutoresizingMaskIntoConstraints = false
aggregateStack.translatesAutoresizingMaskIntoConstraints = false
field1.translatesAutoresizingMaskIntoConstraints = false
field2.translatesAutoresizingMaskIntoConstraints = false
f1f2TrailTrail = field2.trailingAnchor.constraint(equalTo: field1.trailingAnchor)
}
override public func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.verticalSizeClass == .regular {
aggregateStack.axis = .vertical
f1f2TrailTrail.isActive = true
} else if traitCollection.verticalSizeClass == .compact {
f1f2TrailTrail.isActive = false
aggregateStack.axis = .horizontal
} else {
print("Unexpected")
}
}
}
Конфликты ограничений здесь -
(
"<NSLayoutConstraint:0x600001e7d1d0 UITextField:0x7f80b2035000.trailing == UITextField:0x7f80b201d000.trailing (active)>",
"<NSLayoutConstraint:0x600001e42800 'UISV-spacing' H:[UITextField:0x7f80b201d000]-(2)-[UITextField:0x7f80b2035000] (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600001e42800 'UISV-spacing' H:[UITextField:0x7f80b201d000]-(2)-[UITextField:0x7f80b2035000] (active)>
Когда я помещаю вывод в www.wtfautolayout.com, я получаю следующее: Проще читать вывод
Второе ограничение, показанное на изображении выше, заставляет меня думать, что изменение вертикальной оси стека не произошло до того, как были оценены ограничения.
Может кто-нибудь сказать мне, что я сделал неправильно или какдля правильной настройки (предпочтительно без раскадровки)?
[РЕДАКТИРОВАТЬ] Текстовые поля выравнивают задний край, чтобы иметь это:
Больше формы - портрет
Больше формы - пейзаж