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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:57:22