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,让窗口尺寸变化和内容动画同步执行,解决窗口瞬间跳变的问题。 - 布局锚定顶部:
- 移除
.fixedSize(),避免视图强制使用最小尺寸,允许窗口根据内容平滑调整大小。 - 给VStack设置
alignment: .top和frame(maxWidth: .infinity, maxHeight: .infinity),让顶部文本始终固定在视图顶部,剩余空间由下方元素填充。 - 给按钮添加
frame(maxWidth: .infinity),让按钮宽度适配窗口,滑动时布局更自然。
- 移除
修改后,切换矩形显示状态时,顶部文本会固定不动,按钮平滑上下滑动,窗口尺寸也会同步进行动画,完全解决移位问题。
内容的提问来源于stack exchange,提问作者jnpdx
相关产品推荐
相关产品推荐

