mirror of
https://github.com/ivanvorobei/SwiftUI.git
synced 2026-05-04 06:24:26 +02:00
74 lines
2.6 KiB
Swift
Executable File
74 lines
2.6 KiB
Swift
Executable File
/*
|
||
See LICENSE folder for this sample’s licensing information.
|
||
|
||
Abstract:
|
||
A view that wraps a UIPageViewController.
|
||
*/
|
||
|
||
import SwiftUI
|
||
import UIKit
|
||
|
||
struct PageViewController: UIViewControllerRepresentable {
|
||
var controllers: [UIViewController]
|
||
@Binding var currentPage: Int
|
||
|
||
func makeCoordinator() -> Coordinator {
|
||
Coordinator(self)
|
||
}
|
||
|
||
func makeUIViewController(context: Context) -> UIPageViewController {
|
||
let pageViewController = UIPageViewController(
|
||
transitionStyle: .scroll,
|
||
navigationOrientation: .horizontal)
|
||
pageViewController.dataSource = context.coordinator
|
||
pageViewController.delegate = context.coordinator
|
||
|
||
return pageViewController
|
||
}
|
||
|
||
func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
|
||
pageViewController.setViewControllers(
|
||
[controllers[currentPage]], direction: .forward, animated: true)
|
||
}
|
||
|
||
class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
|
||
var parent: PageViewController
|
||
|
||
init(_ pageViewController: PageViewController) {
|
||
self.parent = pageViewController
|
||
}
|
||
|
||
func pageViewController(
|
||
_ pageViewController: UIPageViewController,
|
||
viewControllerBefore viewController: UIViewController) -> UIViewController? {
|
||
guard let index = parent.controllers.firstIndex(of: viewController) else {
|
||
return nil
|
||
}
|
||
if index == 0 {
|
||
return parent.controllers.last
|
||
}
|
||
return parent.controllers[index - 1]
|
||
}
|
||
|
||
func pageViewController(
|
||
_ pageViewController: UIPageViewController,
|
||
viewControllerAfter viewController: UIViewController) -> UIViewController? {
|
||
guard let index = parent.controllers.firstIndex(of: viewController) else {
|
||
return nil
|
||
}
|
||
if index + 1 == parent.controllers.count {
|
||
return parent.controllers.first
|
||
}
|
||
return parent.controllers[index + 1]
|
||
}
|
||
|
||
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
|
||
if completed,
|
||
let visibleViewController = pageViewController.viewControllers?.first,
|
||
let index = parent.controllers.firstIndex(of: visibleViewController) {
|
||
parent.currentPage = index
|
||
}
|
||
}
|
||
}
|
||
}
|