将UIStackView作为UITableViewCell的accessoryView时按钮不显示
问题根因
你的UIStackView创建逻辑没有语法错误,问题出在视图的固有尺寸特性上:
- 单个UIButton直接赋值给
accessoryView可以正常显示,是因为UIButton自带固有内容尺寸,UITableViewCell能自动读取这个尺寸完成accessoryView的布局 - UIStackView是特殊的容器视图,本身没有固有内容尺寸,直接赋值给
accessoryView时,系统会默认给它分配0×0的布局尺寸,容器里的按钮自然会被挤压到完全不可见
修复方法
只需要给作为accessoryView的UIStackView明确指定尺寸即可,两种常用实现:
方案1:手动设置StackView的frame
修改newStackView()方法,返回前根据内部按钮的大小计算栈视图的frame:
private func newStackView() -> UIView { let eyeButton = UIButton(image: "eye") let refreshButton = UIButton(image: "refresh") let stackView = UIStackView(arrangedSubviews: [eyeButton, refreshButton]) stackView.axis = .horizontal stackView.spacing = 12 // 按需调整两个按钮的间距 // 计算栈视图所需总尺寸 let totalWidth = eyeButton.bounds.width + refreshButton.bounds.width + stackView.spacing let viewHeight = max(eyeButton.bounds.height, refreshButton.bounds.height) stackView.frame = CGRect(x: 0, y: 0, width: totalWidth, height: viewHeight) return stackView }
方案2:通过自动布局约束撑开StackView
如果不想手动计算frame,可以给栈视图添加明确的宽高约束,让它贴合内部内容的尺寸:
private func newStackView() -> UIView { let eyeButton = UIButton(image: "eye") let refreshButton = UIButton(image: "refresh") let stackView = UIStackView(arrangedSubviews: [eyeButton, refreshButton]) stackView.axis = .horizontal stackView.spacing = 12 stackView.translatesAutoresizingMaskIntoConstraints = false // 绑定宽高和内容尺寸匹配 stackView.widthAnchor.constraint(equalToConstant: eyeButton.bounds.width + refreshButton.bounds.width + stackView.spacing).isActive = true stackView.heightAnchor.constraint(equalToConstant: max(eyeButton.bounds.height, refreshButton.bounds.height)).isActive = true return stackView }
小提示:如果后续会动态切换按钮的显隐状态,优先选方案2,更新约束后可以自动适配栈视图的尺寸变化,不需要每次手动修改frame值。
内容的提问来源于stack exchange,提问作者goofy4224
相关产品推荐
相关产品推荐

