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
相关产品推荐
相关产品推荐

