Swift MacOS应用程序窗口大小发生了变化吗?

huangapple go评论113阅读模式
英文:

Swift MacOS application window size did change?

问题

我需要根据视图的方向更改主视图的内容。如果用户将视图的大小从横向更改为纵向,我需要更改主视图。
如何使用Swift检测MacOS应用程序的主视图大小是否发生了变化,并获取新的大小?

英文:

I need to change main view content depending on view orientation. If user changed the size of view from Landscape to portrait I need to change main view.
How to detect using swift that MacOS application main view size did changed and get new size?

答案1

得分: 1

根据@jnpdx的评论,我创建了以下解决方案:

#if os(macOS)
enum UserInterfaceSizeClass {
    case compact
    case regular
}
#endif

struct ContentView: View {
    @State var verticalSizeClass = UserInterfaceSizeClass.regular
    @State var horizontalSizeClass = UserInterfaceSizeClass.regular

    var body: some View {
        GeometryReader { geometry in
            Subview()
                .environment(\.horizontalSizeClass, horizontalSizeClass)
                .environment(\.verticalSizeClass, verticalSizeClass)
                .onChange(of: geometry.size) { size in
                    updateSizeClasses(size: size)
                }
        }
    }

    private func updateSizeClasses(size: CGSize) {
        // 如果需要,可以更新SizeClasses的逻辑
    }
}

这是一个基于@jnpdx评论的解决方案。代码中定义了一个UserInterfaceSizeClass枚举,用于表示用户界面的尺寸类别。在ContentView结构体中,使用@State属性包装器来存储垂直和水平尺寸类别的状态。在body计算属性中,使用GeometryReader来获取父视图的几何信息,并将Subview视图嵌套其中。通过使用.environment修饰符,将垂直和水平尺寸类别传递给Subview视图。同时,使用.onChange修饰符来监测几何大小的变化,并调用updateSizeClasses方法来更新尺寸类别。

英文:

Based on @jnpdx comment I created solution:

#if os(macOS)
enum UserInterfaceSizeClass {
    case compact
    case regular
}
#endif

struct ContentView: View {
    @State var verticalSizeClass = UserInterfaceSizeClass.regular
    @State var horizontalSizeClass = UserInterfaceSizeClass.regular

    var body: some View {
        GeometryReader { geometry in
            Subview()
                .environment(\.horizontalSizeClass, horizontalSizeClass)
                .environment(\.verticalSizeClass, verticalSizeClass)
                .onChange(of: geometry.size) { size in
                    updateSizeClasses(size: size)
                }
        }
    }

    private func updateSizeClasses(size: CGSize) {
        // Some logic updated SizeClasses IF NEED
    }
}

huangapple
  • 本文由 发表于 2023年8月8日 23:33:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76861079.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定