2017-06-25 9 views
1

ページビューコントローラページとページインジケータを同時に自動スライドしようとしています。私のページビューコントローラには5ページあります。流れは図1-5からうまく機能しますが、5番目から1番目の画像に戻って自動滑りを再開できません。以下はPageViewController - Auto Slide - Swift 3

私のコードです:

import UIKit 

class PageSliderViewController: UIViewController , UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    @IBOutlet weak var pageControl: UIPageControl! 

    var pageContainer: UIPageViewController! 

    // The pages it contains 
    var pages = [UIViewController]() 

    // Track the current index 
    var currentIndex: Int? 
    private var pendingIndex: Int? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the pages 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let page1: UIViewController! = storyboard.instantiateViewController(withIdentifier: "Page1") 
     let page2: UIViewController! = storyboard.instantiateViewController(withIdentifier: "Page2") 
     let page3: UIViewController! = storyboard.instantiateViewController(withIdentifier: "Page3") 
     let page4: UIViewController! = storyboard.instantiateViewController(withIdentifier: "Page4") 
     let page5: UIViewController! = storyboard.instantiateViewController(withIdentifier: "Page5") 
     pages.append(page1) 
     pages.append(page2) 
     pages.append(page3) 
     pages.append(page4) 
     pages.append(page5) 
     // Create the page container 
     pageContainer = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) 
     pageContainer.delegate = self 
     pageContainer.dataSource = self 
     pageContainer.setViewControllers([page1], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 

     currentIndex = 0 

     // Add it to the view 
     view.addSubview(pageContainer.view) 

     // Configure our custom pageControl 
     self.view.bringSubview(toFront: self.loginButton) 
     self.view.bringSubview(toFront: self.signUpButton) 
     self.view.bringSubview(toFront: self.pageControl) 
     pageControl.numberOfPages = pages.count 
     pageControl.currentPage = 0 

     Timer.scheduledTimer(timeInterval: 5, 
          target: self, 
          selector: #selector(self.next(_:)), 
          userInfo: nil, 
          repeats: true) 

    } 

    func next(_ timer: Timer) { 
     pageContainer.goToNextPage() 
     currentIndex = currentIndex! + 1 
     if currentIndex == pageControl.numberOfPages{ 
      currentIndex = 0 
     } 
     pageControl.currentPage = currentIndex! 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - UIPageViewController delegates 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     let currentIndex = pages.index(of: viewController)! 
     if currentIndex == 0 { 
      return nil 
     } 
     let previousIndex = abs((currentIndex - 1) % pages.count) 
     return pages[previousIndex] 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     let currentIndex = pages.index(of: viewController)! 
     if currentIndex == pages.count-1 { 
      return nil 
     } 
     let nextIndex = abs((currentIndex + 1) % pages.count) 
     return pages[nextIndex] 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { 
     pendingIndex = pages.index(of: pendingViewControllers.first!) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
     if completed { 
      currentIndex = pendingIndex 
      if let index = currentIndex { 
       pageControl.currentPage = index 
      } 
     } 
    } 
} 

extension UIPageViewController { 
    func goToNextPage(animated: Bool = true, completion: ((Bool) -> Void)? = nil) { 
     if let currentViewController = viewControllers?[0] { 
      if let nextPage = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) { 
       setViewControllers([nextPage], direction: .forward, animated: animated, completion: completion) 
      } 
     } 
    } 
} 

(注)このコードをページのコントロールが第一ドットに5日から行くが、ページが変更されていないこと。小さな間違いがありますが、理解できません。どんな助けでも大歓迎です!

答えて

2

私は実行にこのコードを試していないが、私の推測は次のとおりです。

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    let currentIndex = pages.index(of: viewController)! 
    if currentIndex == pages.count-1 { 
     return nil 
    } 
    let nextIndex = abs((currentIndex + 1) % pages.count) 
    return pages[nextIndex] 
} 

配列はゼロベースなので、あなたが現在page 5を見ている場合、あなたはpages[4]見ています。 ...とpages.count - 1あなたのコードが言っている、だから、4に等しい:

if the current page is page5 
    return nil 

だからあなたfunc goToNextPage()拡張子はviewControllerAfterのために呼び出し、RETでnilを取得urn。

あなたが最も可能性が高いとviewControllerAfterを変更したい:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    let currentIndex = pages.index(of: viewController)! 

    // you don't need this, because you are using % modulo operator 
    // to keep "nextIndex" within the array bounds 
    //if currentIndex == pages.count-1 { 
    // return nil 
    //} 

    let nextIndex = abs((currentIndex + 1) % pages.count) 
    return pages[nextIndex] 
} 
+0

ありがとう!出来た :) – Mamta