创建一个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
)
}