首页 > 解决方案 > 带有 PageTabViewStyle 的 TabView 无法正确旋转到横向并返回

问题描述

使用 Swift5.3.2、iOS14.4、Xcode12.4、

我正在尝试在 SwiftUI 中将 TabView 旋转为横向并返回纵向。

我将 TabView 作为 PageTabViewStyle 运行,以使其看起来像 PageViewController。

一切正常,除了旋转到横向和回到纵向。

每当我旋转时,选项卡都会跳到一个随机数!

这是我的代码:

TabView(selection: self.$selectedTab) {    
    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())
.onRotate { _ in
    print(selectedTab)
}

为了更好地观察我们最终的标签,我编写了这个视图扩展和自定义修饰符。但是,在没有扩展名和自定义修饰符的情况下,已经发生了不需要的制表符跳转。

知道该怎么做吗?

extension View {
   
    func onRotate(perform action: @escaping (UIDeviceOrientation) -> Void) -> some View {
        self.modifier(DeviceRotationViewModifier(action: action))
    }
}
struct DeviceRotationViewModifier: ViewModifier {
   
    let action: (UIDeviceOrientation) -> Void
    func body(content: Content) -> some View {
        content
        .onAppear()
        .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
          action(UIDevice.current.orientation)
        }
    }
}

标签: swiftlandscapeios14tabviewpagetabviewstyle

解决方案


推荐阅读