Swift:iOS运行时如何通过代码修改StackView嵌套的按钮尺寸
解决方案
根因说明
嵌套在UIStackView中的视图尺寸由StackView的布局规则统一管控,手动修改frame的操作会被StackView的自动布局逻辑覆盖,因此无论设置什么数值都不会生效。
具体实现方案
方案1:约束控制尺寸(适配Storyboard开发模式)
- 在Storyboard中分别给1x、2x按钮添加固定宽高约束,默认状态下的宽高设为正常选中状态的尺寸(如32pt),将两个按钮的宽高约束分别关联到代码的IBOutlet属性:
@IBOutlet weak var btn1xWidth: NSLayoutConstraint! @IBOutlet weak var btn1xHeight: NSLayoutConstraint! @IBOutlet weak var btn2xWidth: NSLayoutConstraint! @IBOutlet weak var btn2xHeight: NSLayoutConstraint!
- 切换变焦档位时修改约束的
constant值,之后刷新StackView布局即可:
// 选中2x档位的处理逻辑 btn1xWidth.constant = 8 btn1xHeight.constant = 8 btn2xWidth.constant = 32 btn2xHeight.constant = 32 // 加动画的写法,不需要动画可以去掉外层的animate块 UIView.animate(withDuration: 0.15) { self.stackView.layoutIfNeeded() }
方案2:transform缩放(代码量最少,适配交互动效)
不需要修改Storyboard配置,直接通过变换实现视觉缩放,且不会缩小按钮的点击交互区域,更适合相机场景的操作需求:
// 选中2x档位 btn1x.transform = CGAffineTransform(scaleX: 0.25, y: 0.25) // 缩放比例可自行调整 btn2x.transform = .identity // 选中1x档位 btn2x.transform = CGAffineTransform(scaleX: 0.25, y: 0.25) btn1x.transform = .identity
注意事项
- 不要将StackView的
distribution属性设为fillEqually,否则会强制两个按钮尺寸保持一致,导致约束修改失效 - 若缩放后按钮内容显示偏移,同步调整按钮的
contentEdgeInsets属性即可适配
内容的提问来源于stack exchange,提问作者jayb98
相关产品推荐
相关产品推荐

