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

SwiftUI中Sheet内GeometryReader结合多行文本适配异常问题

Sheet适配内容高度时结合多行文本与GeometryReader的异常问题

尝试让Sheet尺寸自动适配其内容,但在Sheet内结合多行文本使用GeometryReader时出现异常:

  • 首次渲染能计算出正确的Sheet高度,但重渲染后高度被调整为较小值,导致多行文本仅显示一行就被截断
  • 向上拖拽Sheet后,Sheet会自动调整到预期的正确高度

复现代码

struct DemoView: View {
    
    @State
    var isSheetShown = false
    
    let longText = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."
    
    var content: some View {
        Text(longText)
    }
    
    @State
    private var sheetHeight: CGFloat = 0
    
    var body: some View {
        VStack(spacing: 20) {
            
            Button("Show sheet") {
                isSheetShown.toggle()
            }
            .sheet(isPresented: $isSheetShown) {
                self.content
                    .overlay {
                        GeometryReader { geometry in
                            let _ = print("Sheet height \(geometry.size.height)")
                            Color.clear.preference(key: InnerHeightPreferenceKey.self, value: geometry.size.height)
                        }
                    }
                    .onPreferenceChange(InnerHeightPreferenceKey.self) { newHeight in
                        self.sheetHeight = newHeight
                    }
                    .presentationDetents(
                        [.height(self.sheetHeight)]
                    )
            }
        }
    }
}

// MARK: - Preference Key

private struct InnerHeightPreferenceKey: PreferenceKey {
    
    static var defaultValue: CGFloat = .zero
    
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = nextValue()
    }
}

运行现象

控制台输出显示视图两次渲染,首次高度正确,重渲染后高度骤降:

Sheet height 86.33333333333333
Sheet height 20.333333333333332

向上拖拽Sheet后,控制台输出高度逐步调整至正确值:

Sheet height 42.33333333333333
Sheet height 64.33333333333333
Sheet height 86.33333333333333

补充说明

为Text添加.lineLimit(nil)无法解决该问题。

内容的提问来源于stack exchange,提问作者Codey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:23:25