I have four pages in a UIPageViewController, and I'd like to hide the dots on the last page. I successfully made a function that gets called on the last page of the UIPageViewController. Basically, if the current view is the last one, it is called. But what do I put in that function to hide the dots temporarily?
I found this https://stackoverflow.com/a/32016614/5700898 but it doesn't help with what goes inside that function. The normal method (hiding page dots on all pages), is not what I need.
How can I hide the page indicator dots only on the last page of a UIPageViewController?
Edit: Here's my code as asked for.
import UIKit
class TutorialController: UIPageViewController {
let pageControl = UIPageControl.appearanceWhenContainedInInstancesOfClasses([])
var currentview = "0"
private func stylePageControl() {
pageControl.currentPageIndicatorTintColor = UIColor.lightGrayColor()
pageControl.pageIndicatorTintColor = UIColor.darkGrayColor()
pageControl.backgroundColor = UIColor.whiteColor()
}
private func hidePageControl() { // this should let us hide the dots on the fourth view, by changing color.
pageControl.backgroundColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
pageControl.currentPageIndicatorTintColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
pageControl.pageIndicatorTintColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
}
private(set) lazy var orderedViewControllers: [UIViewController] = {
return [self.newViewController("1"),
self.newViewController("2"),
self.newViewController("3"),
self.newViewController("4")]
}()
private func newViewController(number: String) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil) .
instantiateViewControllerWithIdentifier("Tutorial\(number)") // calls the next view controller.
}
override func viewDidLoad() {
super.viewDidLoad()
stylePageControl() // just changing the color, this works.
dataSource = self
if let firstViewController = orderedViewControllers.first {
setViewControllers([firstViewController],
direction: .Forward,
animated: true,
completion: nil)
}
}
}
// MARK: UIPageViewControllerDataSource
extension TutorialController: UIPageViewControllerDataSource {
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return orderedViewControllers.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
guard let firstViewController = viewControllers?.first,
firstViewControllerIndex = orderedViewControllers.indexOf(firstViewController) else {
return 0
}
return firstViewControllerIndex
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return nil
}
guard orderedViewControllers.count > previousIndex else {
return nil
}
return orderedViewControllers[previousIndex]
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
currentview = "\(nextIndex)"
print("now on tutorial slide \(currentview)")
if currentview == "4" { // this is called successfully when the fourth page comes into view.
print("we are now on the fourth slide; hiding the page dots...") // this successfully prints.
UIPageControl.appearanceWhenContainedInInstancesOfClasses([TutorialController.self]).hidden = true // this should hide the all page controller dots, but it just doesn't work.
pageControl.hidden = true // also should hide page controller dots, also doesn't work.
hidePageControl() // this should change the color of the page controller dots, but doesn't (note that this function works to change color when I call it on viewDidLoad, but that's not where I want it; it doesn't work here).
print(pageControl.hidden) // always prints false, even though I am trying to set it to true.
}
let orderedViewControllersCount = orderedViewControllers.count
guard orderedViewControllersCount != nextIndex else {
return nil
}
guard orderedViewControllersCount > nextIndex else {
return nil
}
return orderedViewControllers[nextIndex]
}
}