在我们的应用中,我们使用@Environment(\.verticalSizeClass)
和@Environment(\.horizontalSizeClass)
观察大小类的变化。这样做很好,当旋转设备时,我们实现了预期的布局。
问题在于应用程序导航到另一个屏幕时。如果我在人像模式下的MainScreen
上,然后导航到DetailScreen
,然后旋转设备以横向应用程序返回MainScreen
。由于DetailScreen
中的旋转,当应用程序重绘MainScreen
时,NavigationLink
似乎被破坏了。
下面是与我们使用的代码类似的简化代码:
struct MainScreen: View {
@Environment(\.verticalSizeClass) var verticalSizeClass
@Environment(\.horizontalSizeClass) var horizontalSizeClass
var body: some View {
NavigationView {
if horizontalSizeClass == .regular && verticalSizeClass == .compact {
VStack {
// other views..
NavigationLink(
destination: { DetailScreen() },
label: { Text("Go to Details Screen") }
// other views..
}
} else {
HStack {
// other views..
NavigationLink(
destination: { DetailScreen() },
label: { Text("Go to Details Screen") }
// other views..
}
}
}
.navigationViewStyle(.stack)
}
}
struct DetailScreen: View {
@Environment(\.verticalSizeClass) var verticalSizeClass
@Environment(\.horizontalSizeClass) var horizontalSizeClass
var body: some View {
Text("Details Screen")
// Some views that also changes layout base on the verticalSizeClass and horizontalSizeClass
}
}
字符串
是否有人遇到此问题并能够解决?iOS15对我们的应用程序提供支持。
1条答案
按热度按时间1dkrff031#
这是一个相当丑陋的解决方案,但唉,这可能就是为什么
NavigationView
被弃用的原因。这个想法是跟踪您在
if
的哪个分支。每个分支中只有一个NavigationLink
,您可以将一些状态传递给isActive
参数。字符串
然后使用一些逻辑来说明,如果第一个链接是活动的,则显示第一个链接,而不管大小类是什么,第二个链接也是如此。并且如果两者都不是活动的,则根据大小类显示适当的链接。
的数据
如果在每个分支中有多个
NavigationLink
,那么更方便的做法是像下面这样对NavigationLink
进行 Package :型
当然,如果iOS 16可用,您应该使用
NavigationStack
。添加适当的if #unavailable
来处理此问题。