Контроллер просмотра страниц скрывает точки индикатора и останавливается на последней странице (не может вернуться)

У меня есть элемент управления страницей в моем проекте, и я хочу сделать две вещи: 1. Я хочу скрыть точки индикатора на последней странице 2. Я хочу заблокировать последнюю страницу в (страница VC(мой класс)), которую я могу не возвращайся на первую страницу вот мой код

class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate {

lazy var VCArr : [UIViewController] = {
    return [self.VCInstance(name : "FirtsVC"),
            self.VCInstance(name : "SecondVC"),
            self.VCInstance(name :"ThirdVC"),
            self.VCInstance(name :"FourthVC"),
            self.VCInstance(name :"FivethVC")]
}()

private func VCInstance(name : String) -> UIViewController {
    return UIStoryboard(name : "Main" , bundle : nil).instantiateViewController(withIdentifier: name)
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.dataSource = self
    self.delegate = self

    if VCArr.last != nil {
        print("first Page Reached!")
    }

    if let firstVC = VCArr.first {
        setViewControllers([firstVC] , direction: .forward , animated: true, completion: nil)
    }
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let pageVC = UIPageControl()

    for view in self.view.subviews {
        if view is UIScrollView {
            view.frame = UIScreen.main.bounds
        }else if view is UIPageControl{
            view.backgroundColor = UIColor.clear
            pageVC.numberOfPages = 5
            pageVC.center = self.view.center
            pageVC.layer.position.y = self.view.frame.height - 180 ;
        }
    }
}

public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{
    guard let viewControllerIndex = VCArr.index(of: viewController) else {
        return nil
    }

    let previousIndex = viewControllerIndex-1
    guard previousIndex >= 0 else {
        return VCArr.last
    }

    guard VCArr.count > previousIndex else {
        return nil
    }

    return VCArr[previousIndex]
}


public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{
    guard let viewControllerIndex = VCArr.index(of: viewController) else {
        return nil
    }

    let nextIndex = viewControllerIndex+1
    guard nextIndex < VCArr.count
        else {
        return VCArr.first
    }

    guard VCArr.count > nextIndex else {
        return nil
    }
    return VCArr[nextIndex]
}


 public func presentationCount(for pageViewController: UIPageViewController) -> Int{
    return VCArr.count
}

 public func presentationIndex(for pageViewController: UIPageViewController) -> Int{
    guard let firstViewController = viewControllers?.first , let firstViewControllerIndex = VCArr.index(of: firstViewController) else {
        return 0
    }

    return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if (VCArr.last!.isViewLoaded)
    {
        print("It is Done!!!")
    }
    }

1 ответ

Решение

Измените это, что заставляет представление страницы возвращаться к первому, когда оно находится в последнем:

let nextIndex = viewControllerIndex+1
guard nextIndex < VCArr.count
    else {
    return nil //was VCArr.first
}

И чтобы сделать это скрытым, сначала переместите let pageVC = UIPageControl() ниже class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate { сделать его публичным в классе. Затем добавьте:

if nextIndex == VCArr.count{
    pageVC.isHidden = true
}
Другие вопросы по тегам