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

NSWindow中SwiftUI视图动画时锚定指定视图的实现方法

解决方案

要实现顶部文本锚定、按钮平滑滑动且窗口尺寸同步动画的效果,调整布局逻辑和窗口动画设置即可,修改后的代码如下:

struct ContentView: View {
    var body: some View {
        Button("Show window") {
            let window = NSWindow()
            
            window.styleMask = [.titled, .closable]
            // 让窗口尺寸变化参与动画,和内容动画同步
            window.animationBehavior = .default
            
            window.contentView = NSHostingView(rootView: WindowContent())
            
            window.makeKeyAndOrderFront(nil)
            window.center()
        }
        .padding()
    }
}

struct WindowContent: View {
    @State private var showRectangle = false
    
    var body: some View {
        VStack(alignment: .top, spacing: 16) {
            Text("Hello, world")
            
            if showRectangle {
                Rectangle().fill(Color.red)
                    .frame(height: 100)
                    .frame(maxWidth: .infinity)
            }
            
            Button(action: {
                withAnimation(.linear(duration: 3)) {
                    showRectangle.toggle()
                }
            }) {
                Text("Toggle")
            }
            .frame(maxWidth: .infinity)
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .padding(20)
    }
}

关键修改说明:

  • 窗口动画同步:给NSWindow添加animationBehavior = .default,让窗口尺寸变化和内容动画同步执行,解决窗口瞬间跳变的问题。
  • 布局锚定顶部:
    1. 移除.fixedSize(),避免视图强制使用最小尺寸,允许窗口根据内容平滑调整大小。
    2. 给VStack设置alignment: .top和frame(maxWidth: .infinity, maxHeight: .infinity),让顶部文本始终固定在视图顶部,剩余空间由下方元素填充。
    3. 给按钮添加frame(maxWidth: .infinity),让按钮宽度适配窗口,滑动时布局更自然。

修改后,切换矩形显示状态时,顶部文本会固定不动,按钮平滑上下滑动,窗口尺寸也会同步进行动画,完全解决移位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:52:29