为什么在StackView中查看约束不起作用?

时间:2017-02-10 08:02:16

标签: ios swift uiview uistackview

我正在尝试根据official doc

实现自定义控件

问题是放入Horizo​​ntalStackVIew的UIButton对象会填充其所有空间而忽略其按钮约束(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)找到添加了不需要的约束或约束的代码并修复它。 (     "&#34 ;,     "&#34 ;,     "&#34 ;,     "" )

将尝试通过违反约束来恢复

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-02-10 16:59:31.950461 MyControl [1835:91456] [LayoutConstraints]无法同时满足约束条件。     可能至少以下列表中的一个约束是您不想要的约束。     试试这个:         (1)看看每个约束,并试图找出你不期望的;         (2)找到添加了不需要的约束或约束的代码并修复它。 (     "&#34 ;,     "&#34 ;,     "&#34 ;,     "" )

将尝试通过违反约束来恢复

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。 UIView中列出的UIVonstraintBasedLayoutDebugging类别中的方法也可能有所帮助。

Xcode 8.2.1

enter image description here

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

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 here的详细信息:

答案 1 :(得分:-1)

我成功创建了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()
    }
}

enter image description here