在SwiftUI中,当设备方向改变时更新用户界面

3
我开始学习SwiftUI。当方向改变时,我尝试更新UI。 我在我的视图中添加了@Environment(\.horizontalSizeClass) var sizeClass,然后iPhone模拟器会自动更新UI。但是iPad模拟器在旋转时不会更新UI。你能告诉我如何更新iPad的UI吗?

不确定是否可能,也可以参考这里 - koen
这个回答解决了你的问题吗?SwiftUI - 确定当前设备和方向 - pawello2222
2个回答

0
如果您查看人机界面指南中的设备尺寸类别,您会注意到iPad在横向和纵向模式下都具有“常规”宽度和高度。因此,当您使用.horizontalSizeClass时,它适用于iPhone和iPad,只是当iPad旋转时不会更改sizeClass。

https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/

  • 如果您使用GeometryReader设置框架大小,它们将在设备旋转时自动更新。
  • 仅设置视图的.frame(maxWidth:)也非常有用,这样如果iPad处于横向模式,视图的内容将受到限制。大约715左右效果最佳。

在这里使用尺寸类将不起作用。最好像 https://dev59.com/5b7pa4cB1Zd3GeqP8OQT#65586833 中那样使用 UIDevice.orientationDidChangeNotification - pawello2222
iPad在全屏运行时,无论是横屏还是竖屏,都会使用“常规”模式,但当您使用“SplitView”和“SlideOver”模式时,除了应用程序在横向使用70%宽度时,其他所有大小都变为“紧凑”。在SplitView中,当处于纵向时,它可以占据屏幕的40%或60%,与在SplitView中使用的其他应用程序相比。在横向时,它可以占据屏幕的30%、50%和70%。这非常令人困惑,我可能会在一周内忘记这个,但我想在我还记得的时候把它传递给大家。 - James Toomey

0
如果您将iPad放在 SplitView Slideover 模式中,则所有大小都变为.compact ,除非应用程序在横向使用70%的宽度时。在SplitView中,在纵向上,与在SplitView中使用的其他应用程序相比,它可以占据屏幕的40%或60%,在横向上,它可以占据屏幕的30%,50%和70%。
如果您在顶部添加@ Environment 变量 horizontalSizeClass ,如问题中所述,现在可以在SwiftUI中查询并根据需要使用不同的UI:
if sizeClass == .compact {
   // UI for compact mode here
} else if sizeClass == .regular {
   // UI for regular mode here
}

诚然,这是一个小众的使用情况,因为@nicksarno正确指出,无论是纵向还是横向,当iPad全屏运行时,它总是处于常规模式。在这些情况下,您唯一的选择是检查orientationDidChangeNotification,如@pawello2222所述。

enter image description here

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接