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

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

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的评论,我创建了以下解决方案:

  1. #if os(macOS)
  2. enum UserInterfaceSizeClass {
  3. case compact
  4. case regular
  5. }
  6. #endif
  7. struct ContentView: View {
  8. @State var verticalSizeClass = UserInterfaceSizeClass.regular
  9. @State var horizontalSizeClass = UserInterfaceSizeClass.regular
  10. var body: some View {
  11. GeometryReader { geometry in
  12. Subview()
  13. .environment(\.horizontalSizeClass, horizontalSizeClass)
  14. .environment(\.verticalSizeClass, verticalSizeClass)
  15. .onChange(of: geometry.size) { size in
  16. updateSizeClasses(size: size)
  17. }
  18. }
  19. }
  20. private func updateSizeClasses(size: CGSize) {
  21. // 如果需要,可以更新SizeClasses的逻辑
  22. }
  23. }

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

英文:

Based on @jnpdx comment I created solution:

  1. #if os(macOS)
  2. enum UserInterfaceSizeClass {
  3. case compact
  4. case regular
  5. }
  6. #endif
  7. struct ContentView: View {
  8. @State var verticalSizeClass = UserInterfaceSizeClass.regular
  9. @State var horizontalSizeClass = UserInterfaceSizeClass.regular
  10. var body: some View {
  11. GeometryReader { geometry in
  12. Subview()
  13. .environment(\.horizontalSizeClass, horizontalSizeClass)
  14. .environment(\.verticalSizeClass, verticalSizeClass)
  15. .onChange(of: geometry.size) { size in
  16. updateSizeClasses(size: size)
  17. }
  18. }
  19. }
  20. private func updateSizeClasses(size: CGSize) {
  21. // Some logic updated SizeClasses IF NEED
  22. }
  23. }

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:

确定