SwiftUI添加PageViewController

创建一个PageVC.swift,遵循协议UIViewControllerRepresentable

在这里插入图片描述

UIViewControllerRepresentable要完成两个必选方法

func makeUIViewController(context: Context) -> UIPageViewController {
}
func updateUIViewController(_ pageVC: UIPageViewController , context: Context) {
}

得到数据

let featuredLandmarks = landmarks.filter{ $0.isFeatured }

将所有的图片先转换为SwiftUIView再转换为UIViewController


//    var pages = featuredLandmarks.map {
//        UIHostingController(rootView:
//            Image($0.imageName)
//            .resizable()
//        )
//    }

var pages:[UIViewController]

init() {
//map是将featuredLandmarks所有的数据进行大括号内的操作
    pages = featuredLandmarks.map {
        UIHostingController(rootView:
            Image($0.imageName)
            .resizable()
            .scaledToFill()
        )
    }
}

给pageVC添加dataSource

添加dataSource要遵循协议UIPageViewControllerDataSource,该协议只能在class上遵循,struct不行,所以要写一个中间协调源class

同时要遵循协议NSObject,再同时要完成两个必选方法

class Coordinator: NSObject, UIPageViewControllerDataSource {
    
    //将class外的pages传进来
    let pages: [UIViewController]
    
    init(pages: [UIViewController]) {
        self.pages = pages
    }
    //往左滑返回的图片
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.firstIndex(of: viewController)!
        return currentIndex == 0 ? pages.last : pages[currentIndex - 1]
    }
    //往右滑返回的图片
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.firstIndex(of: viewController)!
        return currentIndex == pages.count - 1 ? pages.first : pages[currentIndex + 1]
    }
}

用swiftUI自带的函数makeCoordinator提供中间协调源

func makeCoordinator() -> Coordinator {
    return Coordinator(pages: pages)
}

添加dataSource

func makeUIViewController(context: Context) -> UIPageViewController {
   let pageVC = UIPageViewController(
        transitionStyle: .scroll,//展示效果
        navigationOrientation: .horizontal//水平效果
    )
    
    //添加dataSource
//        pageVC.dataSource = Coordinator(pages: pages)
    pageVC.dataSource = context.coordinator//表示可以直接从上下文中获取中间协调源
    
    return pageVC
}

完成updateUIViewController函数

func updateUIViewController(_ pageVC: UIPageViewController , context: Context) {
    pageVC.setViewControllers(
        [pages[0]],//展示的第一个页面
        direction: .forward,//左划到下一个页面
        animated: true
    )
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章