Почему ограничения просмотра в 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)
   }

}

Более подробную информацию о stackview здесь:

Другие вопросы по тегам