导航视图旋转的 SwiftUI 错误?
SwiftUI bug with navigation view rotation?
在测试我的应用程序以确保其在屏幕旋转下正常运行时,我发现导航 links 在特定的旋转顺序后不起作用。
以下是MWE:
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
}
// rotate -> back -> link -> rotate -> back -> link
}
在 iPhone 13 Pro Max (iOS 15.2 (19C51)) 模拟器上,以下会导致错误:
- 运行应用程序处于纵向模式
- 将应用旋转到横屏模式
- 触摸
back
按钮(在导航栏中)
- 点击导航link
link
- 将应用旋转到纵向模式
- 触摸
back
按钮
- 现在触摸导航link
link
不起作用!
此外,调试控制台打印:
Unbalanced calls to begin/end appearance transitions for <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x152f24860>.
这是 SwiftUI 中的错误吗?
有没有办法解决这个问题?
我在 macOS Monterey (12.2 (21D49)) + Xcode 13.2.1 (13C100).
将 ColumnNavigationViewStyle 更改为 StackNavigationViewStyle 将解决您的问题,您提到的序列很可能是一个错误,希望苹果能尽快解决。
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
.navigationViewStyle(.stack) //Style
}
}
在不必放弃 iPadOS 中的双列布局的情况下,我使用了以下条件视图构建器来根据水平大小使用不同的导航样式 class。
(虽然conditional view builders经常不能很好的配合动画,但是用在这里好像还可以)
extension View {
@ViewBuilder func `if`<TrueContent: View>(
_ condition: Bool,
then trueContent: (Self) -> TrueContent
) -> some View {
if condition {
trueContent(self)
} else {
self
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
.if(UIDevice.current.userInterfaceIdiom == .phone) {
[=10=].navigationViewStyle(.stack)
}
}
}
P.S。每次旋转后适当调整场景大小时,在 iPadOS 中也可以重现此问题,但我认为如果不打算重现,这种情况不太可能发生。
最大值使用横向列,您缺少第二列视图。试试这个
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
Text("Select a link")
}
}
}
在测试我的应用程序以确保其在屏幕旋转下正常运行时,我发现导航 links 在特定的旋转顺序后不起作用。
以下是MWE:
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
}
// rotate -> back -> link -> rotate -> back -> link
}
在 iPhone 13 Pro Max (iOS 15.2 (19C51)) 模拟器上,以下会导致错误:
- 运行应用程序处于纵向模式
- 将应用旋转到横屏模式
- 触摸
back
按钮(在导航栏中) - 点击导航link
link
- 将应用旋转到纵向模式
- 触摸
back
按钮 - 现在触摸导航link
link
不起作用!
此外,调试控制台打印:
Unbalanced calls to begin/end appearance transitions for <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x152f24860>.
这是 SwiftUI 中的错误吗? 有没有办法解决这个问题?
我在 macOS Monterey (12.2 (21D49)) + Xcode 13.2.1 (13C100).
将 ColumnNavigationViewStyle 更改为 StackNavigationViewStyle 将解决您的问题,您提到的序列很可能是一个错误,希望苹果能尽快解决。
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
.navigationViewStyle(.stack) //Style
}
}
在不必放弃 iPadOS 中的双列布局的情况下,我使用了以下条件视图构建器来根据水平大小使用不同的导航样式 class。
(虽然conditional view builders经常不能很好的配合动画,但是用在这里好像还可以)
extension View {
@ViewBuilder func `if`<TrueContent: View>(
_ condition: Bool,
then trueContent: (Self) -> TrueContent
) -> some View {
if condition {
trueContent(self)
} else {
self
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
}
.if(UIDevice.current.userInterfaceIdiom == .phone) {
[=10=].navigationViewStyle(.stack)
}
}
}
P.S。每次旋转后适当调整场景大小时,在 iPadOS 中也可以重现此问题,但我认为如果不打算重现,这种情况不太可能发生。
最大值使用横向列,您缺少第二列视图。试试这个
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink("link") {
Text("hi")
}
Text("Select a link")
}
}
}