UIPageViewController设置限制页面

时间:2015-11-11 12:49:30

标签: ios swift uipageviewcontroller sliding

我开始学习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
}

}

但滑动并没有在第三页停止,而是从第一页开始。 如何向前和向后限制幻灯片页面?

3 个答案:

答案 0 :(得分:2)

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

;

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

将以下行添加到方法`

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

`注意:这是根据目标c。

答案 1 :(得分:0)

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

试试这段代码。这可能对你有所帮助

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

答案 2 :(得分:0)

正如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]
}