Swiftui 迅捷+;UIPageViewController,多种视图类型

Swiftui 迅捷+;UIPageViewController,多种视图类型,swiftui,uikit,uipageviewcontroller,uiviewcontrollerrepresentable,Swiftui,Uikit,Uipageviewcontroller,Uiviewcontrollerrepresentable,我想在我的SwiftUI应用程序中使用UIPageViewController,如中所示。但是,本教程传递的视图类型与页面相同,我希望传递任何类型的视图 struct PageViewController<Page: View>: UIViewControllerRepresentable { var pages: [Page] @Binding var currentPage: Int func makeCoordinator() -> Co

我想在我的SwiftUI应用程序中使用UIPageViewController,如中所示。但是,本教程传递的视图类型与页面相同,我希望传递任何类型的视图

struct PageViewController<Page: View>: UIViewControllerRepresentable {
    var pages: [Page]
    @Binding var currentPage: Int
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIPageViewController {
        let pageViewController = UIPageViewController(
            transitionStyle: .scroll,
            navigationOrientation: .horizontal)
        pageViewController.delegate = context.coordinator
        return pageViewController
    }

    func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
        pageViewController.setViewControllers(
            [context.coordinator.controllers[currentPage]], direction: .forward, animated: true)
    }
    
    class Coordinator: NSObject, UIPageViewControllerDelegate {
        var parent: PageViewController
        var controllers = [UIViewController]()
        
        init(_ pageViewController: PageViewController) {
            parent = pageViewController
            controllers = parent.pages.map { UIHostingController(rootView: $0) }
        }
        
        func pageViewController(
            _ pageViewController: UIPageViewController,
            didFinishAnimating finished: Bool,
            previousViewControllers: [UIViewController],
            transitionCompleted completed: Bool) {
            if completed,
               let visibleViewController = pageViewController.viewControllers?.first,
               let index = controllers.firstIndex(of: visibleViewController) {
                parent.currentPage = index
            }
        }
    }
}


struct PageView<Page: View>: View {
    var pages: [Page]
    @State var currentPage = 0

    var body: some View {
        ZStack {
            PageViewController(pages: pages, currentPage: $currentPage)
        }
    }
}

struct PageView_Previews: PreviewProvider {
    static var previews: some View {
        PageView(pages: [
            Color.red,
            Color.blue 
            // I want to add other view types here
        ])
    }
}
struct PageViewController:UIViewControllerRepresentable{
变量页面:[第页]
@绑定变量currentPage:Int
func makeCoordinator()->Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:context)->UIPageViewController{
让pageViewController=UIPageViewController(
transitionStyle:。滚动,
导航方向:。水平)
pageViewController.delegate=context.coordinator
返回页面视图控制器
}
func updateUIViewController(uPageViewController:UIPageViewController,上下文:上下文){
pageViewController.SetViewController(
[context.coordinator.controllers[currentPage]],方向:。前进,动画:true)
}
类协调器:NSObject,UIPageViewControllerDelegate{
var父级:PageViewController
变量控制器=[UIViewController]()
初始化(uPageViewController:pageViewController){
父项=页面视图控制器
controllers=parent.pages.map{UIHostingController(rootView:$0)}
}
页视图控制器(
_pageViewController:UIPageViewController,
完成了:布尔,
PreviousViewController:[UIViewController],
过渡已完成:Bool){
如果完成,
让visibleViewController=pageViewController.ViewController?。首先,
让index=controllers.firstIndex(of:visibleViewController){
parent.currentPage=索引
}
}
}
}
结构页面视图:视图{
变量页面:[第页]
@状态变量currentPage=0
var body:一些观点{
ZStack{
PageViewController(页面:页面,当前页面:$currentPage)
}
}
}
结构页面视图\u预览:PreviewProvider{
静态var预览:一些视图{
页面视图(页面:[
颜色,红色,
蓝色
//我想在这里添加其他视图类型
])
}
}
如果我将PageView_预览中的页面数组更改为类似于[Color.red,Text(“abc”)]的内容,则会出现错误,因为它们的类型不同。如何让SwiftUI在这里允许异构视图类型


我无法将TabView与PageTabViewStyle结合使用(有很多错误),因此我需要使用此UIKit方法。

您可以将页面包装在
任意视图中:

PageView(pages: [
            AnyView(Color.red),
            AnyView(Color.blue),
            AnyView(Text("Hi"))
])

我发现这个SwiftUIPager是PageTabViewStyle的一个很好的替代品: