2014-05-13 19 views
8

Mam UIPageViewController, który pokazuje różne strony. Obecne zachowanie polega na tym, że przestaje się przewijać po dotarciu do ostatniej strony. Teraz chciałbym osiągnąć to, że na ostatniej stronie i przewijaniu w prawo przechodzi na pierwszą stronę. Kiedy na pierwszej stronie, przejdź do ostatniej strony, przewijając w lewo. Zasadniczo pozwól stronie PageViewController pokazać strony w kółkach. Moje pierwsze podejście działa całkiem dobrze, mając jednocześnie więcej niż jedną stronę, albo wychodząc z jednej strony:Jak dokonać uipageviewcontroller przejdź w kółka

- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(TMCollectionViewController *)viewController 
{ 

    if((viewController.pageIndex) >= 1) 
    { 
     return _viewControllers[viewController.pageIndex - 1]; 
    } 
    else 
    { 
     if ([_viewControllers count] == 1) { 
      return nil; 
     } 
     return [_viewControllers objectAtIndex:[_viewControllers count]-1]; 
    } 
} 

Ale kiedy usunąć strony, tak że pozostaje tylko jedna, to nadal pamięta albo się przed lub po stronie, i pokazuje to odpowiednio. Mimo że w tablicy pozostaje tylko jedna strona. Każda pomoc jest wysoko ceniona.

Odpowiedz

12

można wdrożyć go jako

Kiedy jesteś na 1. indeksu i przesuń w lewo, aby jego index = całkowitą liczbę stron

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if ((index == 0) || (index == NSNotFound)) { 
     index = self.pageTitles.count; 
    } 

    index--; 
    return [_viewControllers objectAtIndex:index]; 
} 

Kiedy jesteś na ostatnim indeksie ustawić go na zero indeks

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == [self.pageTitles count]) { 
     index = 0; 
    } 
    return [_viewControllers objectAtIndex:index]; 
} 
+0

Witam i dziękuję za szybką odpowiedź. Próbowałem twojego kodu, ale pokazuje podobne zachowanie jak moje własne podejście. Działa dobrze, gdy ma wiele stron. W mojej aplikacji każda strona reprezentuje źródło wiadomości, które można dodać lub usunąć. Więc jeśli użytkownik ma np. pięć źródeł, kod działa dobrze. Teraz, gdy użytkownik usunie cztery z pięciu, a zatem pozostało tylko jedno w PageViewController, nadal można przewijać w lewo i w prawo, ale widzi białe strony z irytującymi efektami krzykliwymi. –

+0

Twój licznik w 'presentationCountForPageViewController' może nie być aktualizowany, więc dostajesz 5 stron, chociaż ma tylko 1 i otrzymujesz 4 strony białe – Heena

+0

Strony, które przedstawiam, znajdują się w tablicy _viewControllers. Po usunięciu przez użytkownika czterech z pięciu stron, tablica _viewControllers składa się tylko z jednego kontrolera ViewController. "presentationCountForPageViewController" odpowiada za pomocą [_viewControllers count]. Ale jakoś nie pomaga. –

2

Dzięki @Roshni

Swift 2 - rozwiązanie Roshni za

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    var index: Int = (viewController as! PageContentViewController).index 

    if index == 0 || index == NSNotFound { 
     index = self.pageTitles.count 
    } 

    index-- 
    return viewControllerAtIndex(index) 
} 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
    var index: Int = (viewController as! PageContentViewController).index 

    if index == NSNotFound { 
     return nil 
    } 

    index++ 
    if index == self.pageTitles.count { 
     index = 0 
    } 
    return viewControllerAtIndex(index) 
} 
+1

Niesamowite, dziękuję bardzo! – swiftBoy

1

tutaj jest próbka, zrobiłem dla okrągłej paginacji

używałem Korzystanie UIPageViewController to create a content slider (Objective-C/Swift) artykuł ale dzięki @Tom Calmon i @Roshani teraz jestem w stanie osiągnąć mój pożądany rezultat na Swift 2,2

class PageHomeViewController: UIViewController , UIPageViewControllerDataSource{ 

    // MARK: - Variables 
    private var pageViewController: UIPageViewController? 

    // Initialize it right away here 
    private let contentImages = ["nature_pic_1.png", 
           "nature_pic_2.png", 
           "nature_pic_3.png", 
           "nature_pic_4.png"]; 

    //MARK: - View controller life cycle methods 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     createPageViewController() 
     setupPageControl() 
    } 

    //MARK: - Create and start page view controller 
    private func createPageViewController() { 
     let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController 
     pageController.dataSource = self 

     if contentImages.count > 0 { 
      let firstController = getItemController(0)! 
      let startingViewControllers: NSArray = [firstController] 
      pageController.setViewControllers(startingViewControllers as? [UIViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) 
     } 

     pageViewController = pageController 
     addChildViewController(pageViewController!) 
     self.view.addSubview(pageViewController!.view) 
     pageViewController!.didMoveToParentViewController(self) 
    } 

    private func setupPageControl() { 
     let appearance = UIPageControl.appearance() 
     appearance.pageIndicatorTintColor = UIColor.grayColor() 
     appearance.currentPageIndicatorTintColor = UIColor.whiteColor() 
     appearance.backgroundColor = UIColor.darkGrayColor() 
    } 

    // MARK: - UIPageViewControllerDataSource 
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     var index: Int = (viewController as! PageContentViewController).itemIndex 

     if index == 0 || index == NSNotFound { 
      index = contentImages.count 
     } 

     index -= 1 
     return getItemController(index) 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{ 
     var index: Int = (viewController as! PageContentViewController).itemIndex 
     if index == NSNotFound {return nil} 
     index += 1 
     if index == contentImages.count {index = 0} 
     return getItemController(index) 
    } 

    private func getItemController(itemIndex: Int) -> PageContentViewController? { 
     if itemIndex < contentImages.count { 
      let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController 
      pageItemController.itemIndex = itemIndex 
      pageItemController.imageName = contentImages[itemIndex] 
      return pageItemController 
     } 
     return nil 
    } 

    // MARK: - Page Indicator 
    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
     return contentImages.count 
    } 
    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
     return 0 
    } 

} 

enter image description here

Mam nadzieję, że pomoże to komuś, pewnego dnia !!

Powiązane problemy