SwiftUI如何给ScrollView设置最大高度,内容超出后可滚动?
解决方案
完全可以实现,只需要修改你代码中ScrollView的高度设置逻辑即可,具体操作如下:
- 首先修正你原代码的一处疏漏:你已经通过
viewHeightReader将Chips内容的实际总高度存入了totalHeight状态变量,原来代码最后给ScrollView设置的height: height用的是布局过程中的临时局部变量,属于逻辑错误,要替换为totalHeight。 - 要设置最大高度限制,只需要用
min()函数取「内容实际高度」和「你预设的最大高度」的较小值作为ScrollView的高度即可:当内容高度小于最大高度时,容器自适应内容高度;当内容高度超过最大高度时,容器高度固定为你设置的最大值,ScrollView自动进入可滚动状态。
修改后的完整代码示例(预设最大高度为300,可自行调整数值):
struct ChipsContent: View { @ObservedObject var viewModel = ChipsViewModel() @State private var totalHeight = CGFloat.zero // 预设最大高度,可根据需求调整 private let maxContainerHeight: CGFloat = 300 var body: some View { var width = CGFloat.zero var height = CGFloat.zero return ScrollView { GeometryReader { geo in ZStack(alignment: .topLeading, content: { ForEach(viewModel.dataObject) { chipsData in Chips(systemImage: chipsData.systemImage, titleKey: chipsData.titleKey, isSelected: chipsData.isSelected) .padding(.all, 5) .alignmentGuide(.leading) { dimension in if (abs(width - dimension.width) > geo.size.width) { width = 0 height -= dimension.height } let result = width if chipsData.id == viewModel.dataObject.last!.id { width = 0 } else { width -= dimension.width } return result } .alignmentGuide(.top) { dimension in let result = height if chipsData.id == viewModel.dataObject.last!.id { height = 0 } return result } } }).background(viewHeightReader($totalHeight)) }.padding(.all, 5) } // 核心修改:取内容高度和最大高度的较小值作为容器高度 .frame(height: min(totalHeight, maxContainerHeight)) } private func viewHeightReader(_ binding: Binding<CGFloat>) -> some View { return GeometryReader { geometry -> Color in let rect = geometry.frame(in: .local) DispatchQueue.main.async { binding.wrappedValue = rect.size.height } return .clear } } }
内容的提问来源于stack exchange,提问作者Dani Garcia
相关产品推荐
相关产品推荐

