UIPageViewController 设置限制页面

UIPageViewController set limit page

开始学习swift,使用UIPageViewController滑动第3页。我使用 class:

import Foundation
import UIKit

class MyPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var pages = [UIViewController]()
var pageIndicator : UIPageControl!

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self
    self.dataSource = self

    let page1: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page1")
    let page2: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page2")
    let page3: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page3")

    pages.append(page1)
    pages.append(page2)
    pages.append(page3)


    setViewControllers([page1], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
 func viewControllerAtIndex(index: Int) -> UINavigationController! {
    return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.indexOf(viewController)!
    pageIndicator.currentPage = currentIndex
    let previousIndex = abs((currentIndex - 1) % pages.count)

    return pages[previousIndex]
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.indexOf(viewController)!
    pageIndicator.currentPage = currentIndex
    let nextIndex = abs((currentIndex + 1) % pages.count)
    return pages[nextIndex]
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return pages.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 0
}

}

但是滑动到第三页没有停止,又从第一页开始。 如何限制前后滑动页面?

这是不同的解决方案。 您不需要拥有一整套复杂的代码来执行您需要的操作。 创建一个滚动视图。将其内容大小宽度设置为页数的倍数。

试试这个代码。这可能对您有帮助

override func viewDidLoad() {
    super.viewDidLoad()

    let screensize = UIScreen.mainScreen().bounds

    pagescroll.frame = CGRectMake(0, 0,screensize.width, screensize.height)
    pagescroll.contentSize = CGSize(width: screensize.width*3, height: screensize.height)
    pagescroll.pagingEnabled = true

    page1.frame = CGRectMake(0, 0, screensize.width, screensize.height)
    page2.frame = CGRectMake(screensize.width, 0, screensize.width, screensize.height)
    page3.frame = CGRectMake(screensize.width*2, 0, screensize.width, screensize.height)

    pagescroll.addSubview(page1)
    pagescroll.addSubview(page2)
    pagescroll.addSubview(page2)
    self.view.addSubview(pagescroll)


    // Do any additional setup after loading the view.
}


var pagescroll = UIScrollView()
var page1 = UIView()
var page2 = UIView()
var page3 = UIView()

您还可以根据需要添加页面控制器:UIPageControl

我认为您在以下行中的索引计算有误。 `

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

最后一个视图控制器currentIndex=2,然后nextIndex=(2+1)%3=0。 所以你再次返回索引 0 处的视图控制器。

将以下行添加到您的方法中`

if(currentIndex == (pages.count-1))
  {
        return nil;
   }

`注意:这是根据 objective c.

正如 UIBittu 已经指出的那样:您的计算需要修正。

可能的(可能更具可读性)解决方案可能如下所示:

func indexOfViewController(viewController: UIViewController) -> Int {
    guard let index = pages.indexOf(viewController) else {
        return NSNotFound
    }

    return index
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    var index = indexOfViewController(viewController)

    if (index == 0) || (index == NSNotFound) {
        return nil
    }

    index--

    return pages[index]
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    var index = indexOfViewController(viewController)

    if (index == NSNotFound) || (index+1 == pages.count) {
        return nil
    }

    index++

    return pages[index]
}