UIStackView使用.equalSpacing时自定义复选框视图无法点击如何解决?
问题原因
你遇到的问题本质是equalSpacing模式下的UIStackView布局逻辑和自定义视图约束缺失共同导致的点击区域失效:
- UIStackView的
equalSpacing布局逻辑是优先让所有子视图使用自身的固有内容大小(intrinsicContentSize)布局,剩余空白空间作为子视图之间的间距均匀分配,不会强制修改子视图的尺寸。 - 你自定义的
CustomView内部约束不完整,无法通过子视图撑开自身的尺寸,导致CustomView本身的frame高度为0/远小于内部子视图的大小。而UIView默认clipsToBounds = false,所以超出自身bounds的子视图依然可以正常显示,但点击事件只会在CustomView的bounds范围内响应,超出的区域点击无法传递到borderedView上。 - 而
fillEqually/fillProportionally模式下,StackView会强制给每个子视图分配固定尺寸,把CustomView的frame撑开,所以点击区域正常,事件可以响应。
排查验证方法
打开Xcode的「Debug View Hierarchy」视图调试工具,选中任意一个CustomView查看它的实际frame尺寸,大概率可以看到它的高度远小于内部显示的内容高度,即可确认是点击区域不足导致的问题。
修复方案
修改CustomView的setupUI方法里的约束逻辑,修正错误约束即可:
- 删掉错误的
borderStackView尺寸约束,borderStackView内部已经有带固定尺寸的borderedView和文本label,会自动计算固有大小,不需要手动定死宽高。 - 修改
parentStackView的约束,让它完全撑满整个CustomView,这样CustomView就能通过内部子视图自动撑开自身尺寸:
parentStackView.snp.makeConstraints { make in make.edges.equalToSuperview() // 替换原来的centerY、width约束,上下左右都贴合CustomView }
- 删除
setupUI末尾的两行无用代码,手动调用sizeToFit()和layoutIfNeeded()会干扰自动布局计算:
// 删掉这两行 parentStackView.sizeToFit() layoutIfNeeded()
内容的提问来源于stack exchange,提问作者Dreiohc
相关产品推荐
相关产品推荐

