addArrangedSubview与addSubview

时间:2019-03-18 12:44:38

标签: ios swift xcode uistackview

我是新手,我写了一个继承自StackView的customView,我以编程方式创建了一个button,几乎没有属性,将其添加到自定义视图时,我遇到两个问题:< / p>

  1. 如果我使用addArrangedSubview(myBtn),则视图将忽略那些 我添加并填充整个宽度。但是,如果我使用addSubView(myBtn), 可以(44x44的蓝色正方形)
  2. 如果我使用addArrangedSubview(myBtn),则addTarget()无效,并且 myBtn无法点击,但是当我使用addSubView(myBtn)时,它可以工作 完美。

这是我的自定义视图类:

import UIKit

class RatingControl: UIStackView {

//MARK: Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}

required init(coder: NSCoder) {
    super.init(coder:coder)
    setupButtons()
}

//MARK: Private Methods
private func setupButtons() {

    // Create the button
    let button = UIButton()
    button.backgroundColor = UIColor.blue

    // Add constraints
    button.translatesAutoresizingMaskIntoConstraints = false
    button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
    button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true

    // Setup the button action
    button.addTarget(self, action: #selector(ratingButtonTapped(_:)), for: .touchUpInside)

    // Add the button to the stack
    addArrangedSubview(button)

}
//MARK: Button Action
@objc func ratingButtonTapped(_ sender: Any) {
    print("Button pressed ")
}

}

以下是预览:

enter image description here enter image description here

addSubView()addArrangedSubview()有什么区别?为什么这些问题会发生?

1 个答案:

答案 0 :(得分:1)

我假设您想水平添加几个按钮(例如,使用典型的“星级”评分控件)。

一个UIStackView,可能是根据其.addArrangedSubview()的{​​{1}}方法, 安排 的子视图而推测出来的, .axis.alignment.distribution属性及其.spacing

因此,请阅读有关frame及其用法的一些信息。最有可能的是,您当前正在使用以下方法限制自定义视图:

  • 顶部
  • 领先
  • 尾随(或宽度)

因此,将按钮添加为UIStackView会导致其拉伸到堆栈视图的宽度,因为这是默认设置。

将其添加为arrangedSubView只是将按钮叠加在堆栈视图上,而不是允许堆栈视图对其进行排列,因此堆栈视图的高度可能为零-因此无法轻按按钮

在添加自定义堆栈视图时,尝试设置顶部和前导约束。这应该为您提供一个可以轻按的subview按钮。

使用44 x 44添加更多按钮时,这些按钮将水平排列,这可能是您想要的。