SwiftUI VStack疑问:设置maxHeight:.infinity为何出现额外间距?
为什么设置
maxHeight: .infinity后VStack出现额外间距? 这个问题的核心在于SwiftUI的布局逻辑,是VStack默认间距、视图固有尺寸以及frame对齐方式共同作用的结果:
VStack的默认间距:默认情况下,VStack不会使用
spacing:0,而是采用系统预设的默认间距(不同平台、不同视图类型的间距值不同)。对于Row1、Row2这类仅包含Text的视图,它们的布局框等于Text的固有内容尺寸(刚好包裹文本),所以两个Text布局框之间的默认间距在视觉上可能不明显(因为背景颜色紧贴文本),容易被误以为“无间距”。frame(maxHeight: .infinity)的对齐影响:当给Row3添加这个frame修饰符时,该frame会占据VStack剩余的全部高度,但frame的默认垂直对齐方式是.center——这会让内部的Text("Row3")在整个frame区域内垂直居中。此时,Row2的布局框底部到Row3的Text顶部的距离,等于VStack的默认间距加上frame顶部到Text顶部的空白空间(因为Text居中),视觉上就出现了“额外间距”。
验证与替代解决方法
如果不想设置spacing:0,可以修改Row3的frame对齐方式为顶部,让Text紧贴frame顶部,这样间距就会和Row1-Row2之间保持一致:
Text("Row 3") .frame(maxHeight: .infinity, alignment: .top) .background(.blue)
而设置VStack(spacing:0)能消除额外间距,本质是去掉了VStack在Row2和Row3的frame之间添加的默认间距,此时仅剩下frame内部因居中产生的空白(如果不需要这个空白,还是要设置frame的对齐方式)。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

