Почему ограничения просмотра в StackView не работают?
Я пытаюсь реализовать пользовательский контроль в соответствии с официальным документом
Проблема в том, что объект UIButton, помещенный в HorizontalStackVIew, заполняет все свое пространство, игнорируя ограничения кнопок (width=4.0 height=4.0). (Я пытался с VerticalStackVIew и UITextView и другие, но это то же самое)
class MyControl: UIStackView {
override init(frame: CGRect) {
super.init(frame: frame)
setupButtons()
}
required init(coder: NSCoder) {
super.init(coder: coder)
setupButtons()
}
private func setupButtons() {
// Create the button
let button = UIButton()
button.backgroundColor = UIColor.red
// Add constraints
button.translatesAutoresizingMaskIntoConstraints = false
button.heightAnchor.constraint(equalToConstant: 4.0).isActive = true
button.widthAnchor.constraint(equalToConstant: 4.0).isActive = true
// Add the button to the stack
addArrangedSubview(button)
}
И у меня есть этот журнал, но я не знаю, что с ним делать:
2017-02-10 16: 59: 31.900999 MyControl [1835: 91456] [LayoutConstraints] Невозможно одновременно удовлетворить ограничения. Вероятно, по крайней мере одно из ограничений в следующем списке - это то, что вам не нужно. Попробуйте это: (1) посмотреть на каждое ограничение и попытаться выяснить, чего вы не ожидаете; (2) найдите код, который добавил нежелательное ограничение или ограничения, и исправьте его. ("", "", "", "")
Попытка восстановить, нарушив ограничение
Создайте символическую точку останова на UIViewAlertForUnsatisfiableConstraints, чтобы перехватить это в отладчике. Методы в категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в, также могут быть полезны. 2017-02-10 16:59:31.950461 MyControl[1835:91456] [LayoutConstraints] Невозможно одновременно удовлетворить ограничения. Вероятно, по крайней мере одно из ограничений в следующем списке - это то, что вам не нужно. Попробуйте это: (1) посмотреть на каждое ограничение и попытаться выяснить, чего вы не ожидаете; (2) найдите код, который добавил нежелательное ограничение или ограничения, и исправьте его. ("", "", "", "")
Попытка восстановить, нарушив ограничение
Создайте символическую точку останова на UIViewAlertForUnsatisfiableConstraints, чтобы перехватить это в отладчике. Методы в категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в, также могут быть полезны.
Xcode 8.2.1
2 ответа
Мне удалось создать объект UIStackView и поместить представление (кнопку) в него только программно (не удалось создать его путем перетаскивания на раскадровке из библиотеки объектов).
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Button", for: .normal)
button.backgroundColor = .red
stackView.addArrangedSubview(button)
view?.addSubview(stackView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
Вы можете попробовать это:
class CustomStackView:UIStackView{
override init(frame:CGRect){
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setUpButton()
}
func setUpButton(){
let button:UIButton = UIButton(type: .custom)
button.backgroundColor = .red
self.distribution = .fill
self.addArrangedSubview(button)
}
}