Swift中Horizontal StackView问题:固定宽按钮为何宽度异常?
这种坑我之前踩过好几次!大概率是StackView的布局逻辑和按钮的约束优先级、固有尺寸在互相“打架”,给你几个具体的排查和解决方向:
先看StackView的Distribution属性
要是你把StackView的distribution设成了Fill Equally或者Fill,那StackView会优先按自己的规则分配空间,哪怕你给按钮加了44的固定宽度也没用。试试改成Equal Spacing或者Fill Proportionally,再看按钮宽度会不会回归正常。另外如果StackView本身没设明确的宽度约束,它会玩命拉伸子视图来填满父容器,这也会把你的44宽度给覆盖掉。确认按钮宽度约束的优先级
你给按钮加的宽度约束默认是1000(Required级)吗?如果不是,很可能被StackView的内置布局优先级给压下去了。去检查约束的Priority属性,一定要设成最高的1000,这样系统就必须遵守这个宽度限制。盯紧按钮的固有内容尺寸
虽然是纯图标按钮,但如果你的图标没设固定大小,按钮的intrinsicContentSize可能会被图标撑得很大。要么给按钮的imageView加个宽高约束(比如40x40),要么直接给按钮设置固定的intrinsicContentSize,这样StackView就不会因为按钮的固有尺寸瞎拉伸了。排查约束冲突
打开Xcode的Debug View Hierarchy,看看有没有黄/红色的约束警告。有时候父视图或者其他子视图的约束会和你设的按钮宽度约束冲突,系统会自动打破优先级低的那个,你的44宽度自然就失效了。
还有个小妙招:选中第二个按钮,在Size Inspector里把Content Hugging Priority的Horizontal值调高点(比如251),Compression Resistance Priority也拉满,这样按钮会更“抗拒”被拉伸或压缩,配合固定宽度约束一起用,基本就能解决问题啦!
内容的提问来源于stack exchange,提问作者anthony

