我是新手,我编写了一个继承自StackView的StackView,并以编程方式创建了一个很少有属性的button,当我将它添加到我的自定义视图中时,我有两个问题:
addArrangedSubview(myBtn),我的视图将忽略我添加的属性并填充整个宽度。但是如果我使用addSubView(myBtn),就可以了(在44x44中是一个蓝色方格)。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 ")
}
}以下是预览:


addSubView()和addArrangedSubview()有什么区别?为什么会出现这些问题?
发布于 2019-03-18 13:15:52
我假设您想要水平地添加几个按钮(例如使用典型的“星星”评级控件)。
从UIStackView的.addArrangedSubview()方法可以猜到,根据其.axis、.alignment、.distribution和.spacing属性以及frame排列的子视图。
因此,阅读一些关于UIStackView以及如何使用它的文章。最有可能的是,您目前正在用以下方法约束您的自定义视图:
因此,将按钮作为arrangedSubView添加将导致它延伸到堆栈视图的宽度,因为这是默认的。
将其添加为subview只会覆盖堆栈视图上的按钮,而不是允许堆栈视图对其进行排列,您的堆栈视图的高度可能为零--因此不能点击该按钮。
添加自定义堆栈视图时,尝试只设置顶部和前导约束。这应该会给你一个可以点击的44 x 44按钮。
当您使用.addArrangedSubview()添加更多的按钮时,这些按钮将被水平排列,这可能是您想要的。
https://stackoverflow.com/questions/55221703
复制相似问题