英文:
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
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论