// // SegmentedPageViewController.swift // Tusker // // Created by Shadowfacts on 9/13/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit class SegmentedPageViewController: UIPageViewController, UIPageViewControllerDelegate { let titles: [String] let pageControllers: [UIViewController] private(set) var currentIndex: Int! var segmentedControl: UISegmentedControl! init(titles: [String], pageControllers: [UIViewController]) { self.titles = titles self.pageControllers = pageControllers super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) self.delegate = self } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground segmentedControl = UISegmentedControl(items: titles) segmentedControl.addTarget(self, action: #selector(segmentedControlChanged), for: .valueChanged) navigationItem.titleView = segmentedControl segmentedControl.selectedSegmentIndex = 0 selectPage(at: 0, animated: false) } func selectPage(at index: Int, animated: Bool) { let direction: UIPageViewController.NavigationDirection = currentIndex == nil ? .forward : index - currentIndex > 0 ? .forward : .reverse setViewControllers([pageControllers[index]], direction: direction, animated: animated) navigationItem.title = pageControllers[index].title currentIndex = index } @objc func segmentedControlChanged() { selectPage(at: segmentedControl.selectedSegmentIndex, animated: true) UIImpactFeedbackGenerator(style: .light).impactOccurred() } // MARK: - Page View Controller Delegate func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { currentIndex = pageControllers.firstIndex(of: viewControllers!.first!)! segmentedControl.selectedSegmentIndex = currentIndex navigationItem.title = viewControllers!.first!.title } }