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

如何让SwiftUI visionOS窗口随文本视图动态调整尺寸?

VisionOS窗口随文本动态伸缩+顶部淡出效果实现方案

需求说明

从AI服务流式获取文本(文本量时多时少),需实现以下效果:

  • 窗口随内部文本动态调整大小,最多显示4行内容
  • 文本超出4行时,最新内容始终显示在底部,顶部内容渐变淡出
  • 避免文本被截断或从顶部生硬裁剪的问题

现有问题&尝试

当前文本超出窗口后会被截断并添加"...",窗口不自动扩大;尝试设置minHeight/maxHeight无效,添加fixedSize后文本向上滚动但会从顶部裁剪,无法撑开窗口。

解决方案实现

核心思路

  1. 窗口自适应:通过windowResizability(.contentSize)允许窗口根据内部视图尺寸动态调整
  2. 文本滚动控制:用ScrollView配合ScrollViewReader实现文本底部对齐,流式更新时自动滚动到底部
  3. 顶部淡出效果:通过渐变遮罩实现顶部内容的自然消失
  4. 行数限制:用lineLimit(4)控制文本最多显示4行

修改后的完整代码

var body: some Scene {
    WindowGroup {
        ZStack {
            Color.purple
            
            ResponseView()
                .glassBackgroundEffect()
        }
    }
    .windowResizability(.contentSize) // 允许窗口随内容尺寸变化
    .defaultSize(width: 450, height: 100) // 初始默认尺寸
    .windowStyle(.plain)
}

struct ResponseView: View {
    @State private var responseText: String = "The response will show here."
    
    var body: some View {
        VStack {
            ScrollViewReader { proxy in
                ScrollView(showsIndicators: false) {
                    Text(responseText)
                        .multilineTextAlignment(.center)
                        .lineLimit(4) // 限制最多显示4行
                        .frame(maxWidth: .infinity, alignment: .bottom) // 文本底部对齐
                        .id("responseText") // 滚动定位标识
                }
                .frame(maxHeight: .infinity)
                .mask(
                    // 顶部渐变遮罩,实现内容淡出
                    LinearGradient(
                        gradient: Gradient(colors: [.clear, .black, .black]),
                        startPoint: .top,
                        endPoint: .bottom
                    )
                )
                .onChange(of: responseText) { _ in
                    // 文本更新时自动滚动到底部
                    withAnimation(.spring) {
                        proxy.scrollTo("responseText", anchor: .bottom)
                    }
                }
            }
            
            // 其他条件视图(权限提示/无网络提示等)
        }
        .padding() // 避免内容贴边
    }
}

关键部分说明

  • windowResizability(.contentSize):替代原.contentMinSize,让窗口能随文本增长自动扩大
  • ScrollViewReader+scrollTo:流式文本更新时自动滚动到底部,保证最新内容可见
  • LinearGradient遮罩:顶部透明、向下渐变为不透明,实现顶部内容自然淡出,避免生硬裁剪
  • lineLimit(4):限制最大显示行数,超过后进入滚动状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:05:24