You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI如何给ScrollView设置最大高度,内容超出后可滚动?

解决方案

完全可以实现,只需要修改你代码中ScrollView的高度设置逻辑即可,具体操作如下:

  1. 首先修正你原代码的一处疏漏:你已经通过viewHeightReader将Chips内容的实际总高度存入了totalHeight状态变量,原来代码最后给ScrollView设置的height: height用的是布局过程中的临时局部变量,属于逻辑错误,要替换为totalHeight。
  2. 要设置最大高度限制,只需要用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 09:15:01