. equalspacing在UIStackView中与CustomView不能正常工作



我已经创建了一个复选框/单选按钮的自定义视图,该视图在选中和未选中时显示动画。问题是,当我将自定义视图嵌入到stackView时它是。equalspacing按钮不能再点击了,我的猜测是borderView(它有点击手势)收缩太小了,所以它不能被点击。

奇怪的是,即使它真的缩小了,仍然可以看到borderView。

如果是. filequal.fillProportionally

我使用SnapKit来安排约束。

请告诉我是否应该将整个代码粘贴到这里。

<标题>自定义视图
public final class CustomView: UIView {

// MARK: - Properties

private let borderedView: UIView = {
let view = UIView()
view.layer.borderWidth = 1
return view
}()

private var errorStackView: UIStackView = {
let sv = UIStackView()
sv.isHidden = true
return sv
}()

private var borderStackView: UIStackView = {
let sv = UIStackView()
return sv
}()

private var parentStackView: UIStackView = {
let sv = UIStackView()
return sv
}()
.
.
.
.
.

// MARK: - Lifecycle

public override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}

public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupUI()
}

public init(button: ButtonType) {
super.init(frame: CGRect.zero)
setupUI()
}

public override func draw(_ rect: CGRect) {
setNeedsDisplay()
}
.
.
.
.
.
.
private func setupUI() {
backgroundColor = .clear
borderedView.addSubview(disabledImageView)

borderedView.snp.makeConstraints { make in
make.width.height.equalTo(borderSize)
}

borderStackView = UIStackView(arrangedSubviews: [borderedView, label])
borderStackView.spacing = 12
borderStackView.distribution = .fillProportionally

borderStackView.snp.makeConstraints { make in
make.height.width.equalTo(borderSize)
}

errorStackView = UIStackView(arrangedSubviews: [errorIconImageView, inlineErrorLabel])
errorStackView.spacing = 7
errorStackView.distribution = .fillProportionally

parentStackView = UIStackView(arrangedSubviews: [borderStackView, errorStackView])
parentStackView.axis = .vertical
parentStackView.distribution = .fillProportionally
addSubview(parentStackView)
parentStackView.snp.makeConstraints { make in
make.centerY.equalTo(self.snp.centerY)
make.width.equalToSuperview()
}

disabledImageView.snp.makeConstraints { make in
make
.leading
.trailing
.top
.bottom
.height
.width
.equalToSuperview()
}

parentStackView.sizeToFit()
layoutIfNeeded()
}
.
.
.
.
.
.
// MARK: - Action

public func addAction(action: @escaping ((Bool?) -> Void)) {
borderedView.addGestureRecognizerOnView(target: self, #selector(handleTapGesture(sender:)))
status = action
}
}
<标题>

视图控制器h1> div class="one_answers">我设法通过在自定义视图中添加intrinsicContentSize来解决这个问题

并在每次视图更新时添加invalidateIntrinsicContentSize()。在我的例子中是在handleTapGesture

// MARK: - Lifecycle
public override var intrinsicContentSize: CGSize {
return CGSize(width: 300, height: 50)
}
.
.
.
.
.
// MARK: - Action

@objc private func handleTapGesture(sender: UITapGestureRecognizer) {
invalidateIntrinsicContentSize() // Call this when custom view needs to be updated
}

最新更新