UIPageViewController устанавливает предельную страницу

Я начинаю быстро учиться и использую UIPageViewController для слайда 3 страницы. Я использую класс:

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
}

}

Но скольжение не прекращается на третьей странице, а начинается снова с первой страницы. Как ограничить слайд страницы вперед и назад?


person SSHEX    schedule 11.11.2015    source источник


Ответы (3)


Я думаю, что ваш расчет индекса неверен в следующей строке. `

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;
   }

`Примечание: это согласно цели c.

person UIBittu    schedule 11.11.2015
comment
Спасибо! Код для следующей страницы: `if currentIndex == (pages.count-1){ return nil }` - person SSHEX; 11.11.2015
comment
Предыдущая страница: `if currentIndex == 0 { вернуть nil }` - person SSHEX; 11.11.2015

Как уже указывал 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]
}
person tilo    schedule 11.11.2015

Это другое решение. Вам не нужно иметь полный набор сложного кода для выполнения того, что вам нужно. Создайте 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 в соответствии с вашими требованиями.

person Mohammed Janish    schedule 11.11.2015