SwiftUI应用:macOS15.4侧边栏动画异常,如何设置窗口最小尺寸?
能否在不设置内容最小框架的前提下为应用设置窗口最小尺寸?
在macOS 15.4系统中运行以下SwiftUI示例应用时,侧边栏展开和收起会出现异常动画。移除.frame(minWidth: 805, minHeight: 525)代码行可修复该动画问题,但会导致无法限制窗口尺寸;而defaultSize()仅能设置默认尺寸,无法满足最小尺寸的限制需求。
示例代码
enum Page: String, Hashable { case settings = "Settings" case radio = "Radio" case connect = "Connect" var systemImageName: String { switch self { case .settings: return "gear" case .radio: return "radio" case .connect: return "dot.radiowaves.right" } } } struct ContentView: View { @State var pages = [Page.settings, Page.radio, Page.connect] var body: some View { NavigationSplitView { List(pages, id: \.self) { page in Label(page.rawValue.capitalized, systemImage: page.systemImageName) } } detail: { Text("Content") } } } @main struct NavigationTestsApp: App { var body: some Scene { Window("Navigation", id: "H") { Group { ContentView() // 移除该行可修复动画问题,但会失去窗口尺寸限制 .frame(minWidth: 805, minHeight: 525) } } } }
动画问题说明:侧边栏展开或收起时,窗口会出现不必要的尺寸跳动或卡顿,破坏原本流畅的过渡动画。
解决方案
直接在Window场景层面配置窗口最小尺寸,而非在视图上添加强制框架约束,这样既能限制窗口大小,又不会干扰NavigationSplitView的动画逻辑:
修改后的NavigationTestsApp代码:
@main struct NavigationTestsApp: App { var body: some Scene { Window("Navigation", id: "H") { ContentView() } .windowResizability(.contentSize) .minimumSize(CGSize(width: 805, height: 525)) } }
原理说明
.windowResizability(.contentSize):指定窗口尺寸由内容决定,保持NavigationSplitView的自适应布局能力.minimumSize(...):直接在窗口级别设置最小尺寸限制,不会影响视图内部的布局计算和动画过渡,从根源避免了动画异常问题
内容的提问来源于stack exchange,提问作者CalebK
相关产品推荐
相关产品推荐

