为什么 SwiftUI 的 TabView 旋转到横向会跳转到随机选项卡编号?

iKK*_*iKK 6 landscape tabview swift

使用 Swift 5.3.2、Xcode 12.4、iOS 14.4、

我正在尝试在 SwiftUI 中制作一个简单的 Page-TabView (参见下面的代码摘录)。

当旋转到横向或返回纵向时,出现问题(参见视频):

每当我旋转 iPhone 时,TabView 都会“跳转”到随机选项卡编号。

为什么是这样 ?

我该怎么做才能使 TabView 在旋转时保持当前选项卡号?

(我使用的是iPhoneX)

新的 iOS14 TabView 的 PageControl 功能似乎存在更多问题,如此处所述。(也许旋转设备时的“随机选项卡编号”与所描述的布局问题有关)

在此输入图像描述

import SwiftUI

@main
struct MyApp: App {
    
    var body: some Scene {
        WindowGroup {
            TabView {
                Text("1")
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.pink)
                Text("2")
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.yellow)
                Text("3")
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.green)
                Text("4")
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.blue)
            }
            .tabViewStyle(PageTabViewStyle())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

解决方案之一是使用自定义视图修饰符设置回活动选项卡项,例如this。看起来跳转发生在旋转完成后,因此可以使用延迟计时器:

// Implement your rotation change modifier
.onChange(of: isLandscape) { _ in
    if selectedTab > 0 { // Do not reset for first element
        let beforeIndex = selectedTab
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            selectedTab = beforeIndex
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

完整源代码在这里