2014-05-13 8 views
8

Ich habe einen UIPageViewController, der verschiedene Seiten zeigt. Das aktuelle Verhalten ist, dass es nicht mehr scrollt, wenn ich die letzte Seite erreicht habe. Was ich jetzt erreichen möchte, ist, dass wenn auf der letzten Seite und Scrollen nach rechts, es auf die erste Seite geht. Wenn Sie auf der ersten Seite sind, gehen Sie beim Scrollen nach links zur letzten Seite. Lassen Sie also den PageViewController die Seiten in Kreisen anzeigen. Mein erster Ansatz funktioniert recht gut, während mehr als eine Seite hat, oder beginnend mit einer einzigen Seite:wie man uipageviewcontroller in Kreisen machen

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

Aber wenn ich die Seiten zu entfernen, so dass nur eine übrig bleibt, es erinnert mich noch entweder die vor oder nach der Seite, und zeigt es entsprechend. Obwohl nur eine Seite im Array übrig ist. Jede Hilfe wird sehr geschätzt.

Antwort

12

Sie können es umsetzen als

Wenn Sie am 1. Index und Swipe sind links seinen Index = Gesamtzahl der Seiten

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

machen Wenn Sie sich auf den letzten Index ihn auf Null setzen Index

- (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

Hallo und vielen Dank für Ihre schnelle Antwort. Ich habe deinen Code ausprobiert, aber er zeigt ein ähnliches Verhalten wie mein eigener Ansatz. Es funktioniert gut, wenn Sie viele Seiten haben. In meiner App stellt jede Seite eine Nachrichtenquelle dar, die hinzugefügt oder entfernt werden kann. Wenn ein Benutzer z.B. Fünf Quellen, der Code funktioniert gut. Wenn der Benutzer nun vier der fünf entfernt und daher nur noch eine im PageViewController übrig hat, kann man immer noch nach links und rechts blättern, sieht aber weiße Seiten mit störenden auffälligen Effekten. –

+0

Ihre Anzahl in "presentationCountForPageViewController" wird möglicherweise nicht aktualisiert, sodass Sie 5 Seiten erhalten, obwohl nur 1 und 4 Seiten weiß sind. – Heena

+0

Die Seiten, die ich vorstelle, befinden sich alle im _viewControllers-Array. Nachdem ein Benutzer vier von fünf Seiten gelöscht hat, besteht das Array _viewControllers aus nur einem ViewController. 'presentationCountForPageViewController' antwortet mit [_viewControllers count]. Aber irgendwie hilft das nicht. –

2

Danke, @Roshni

Swift 2 - Roshni Lösung

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

Super vielen Dank !! – swiftBoy

1

hier Probe, ich für die Zirkular Paginierung tat

Ich war mit Verwendung UIPageViewController to create a content slider (Objective-C/Swift) Artikel aber dank @ Tom Calmon und @Roshani jetzt ich bin in der Lage zu erreichen mein gewünschtes Ergebnis auf 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

Hoffe, das wird da draußen jemanden helfen, eines Tages !!