2015-01-13 13 views
6

Questi due metodi viewControllerBeforeViewController e viewControllerAfterViewController dello UIPageViewControllerDataSource non indicano la direzione dello scorrimento.Ottieni la direzione di scorrimento utente in UIPageViewController

Il metodo transitionCompleted del delegato UIPageViewController non ci aiuta molto. Indica solo se la pagina è stata completamente sfogliata.

Quindi quale metodo dovrei usare per rilevare esattamente la direzione dell'utente (sinistra o destra)?

Probabilmente queste due proprietà può aiutare:

let directionForward = UIPageViewControllerNavigationDirection.Forward 
let directionReverse = UIPageViewControllerNavigationDirection.Reverse 

Il mio codice è simile al seguente:

import UIKit 

class ProView: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

var pageViewController: UIPageViewController? 

let characterImages = ["character1", "character2", "character1", "character2", "character1", "character2", "character1", "character2"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    createPageViewController() 
    setupPageControl() 

    character = 1 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// Forward, check if this IS NOT the last controller 
func pageViewController(pageViewController: UIPageViewController, 
    viewControllerAfterViewController ProView: UIViewController) -> UIViewController? { 

     let itemController = ProView as PageItemController 

     // Check if there is another view 
     if itemController.itemIndex+1 < characterImages.count { 

      return getItemController(itemController.itemIndex+1) 
     } 

     return nil 
} 


// Check if this IS NOT the first controller 
func pageViewController(pageViewController: UIPageViewController, 
    viewControllerBeforeViewController ProView: UIViewController) -> UIViewController? { 

    let itemController = ProView as PageItemController 

     if itemController.itemIndex < 0 { 

      return getItemController(itemController.itemIndex-1) 
     } 

     return nil 
} 

private func getItemController(itemIndex: Int) -> PageItemController? { 

    if itemIndex < characterImages.count { 
     let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as PageItemController 
     pageItemController.itemIndex = itemIndex 
     pageItemController.imageName = characterImages[itemIndex] 
     return pageItemController 
} 

    return nil 
} 

func createPageViewController() { 

    let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController 
    pageController.dataSource = self 
    pageController.delegate = self 

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

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

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

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

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 


} 

// BETA 

func pageViewController(PageItemController: UIPageViewController, 
    didFinishAnimating finished: Bool, 
    previousViewControllers pageViewController: [AnyObject], 
    transitionCompleted completed: Bool) 
{ 

    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // This is where you would know the page number changed and handle it appropriately 

    character = workaround 

    } 


} 

class PageItemController: UIViewController { 

@IBOutlet weak var imageCharacterChoose: UIImageView! 

var itemIndex: Int = 0 
var imageName: String = "" { 
    didSet { 

     if let imageView = imageCharacterChoose {imageCharacterChoose.image = UIImage(named: imageName) 
     } 

    } 
} 
} 

Secondo quanto pbasdf detto,

var currentIndex: Int = 0 
var nextIndex: Int = 0 

func pageViewController(PageItemController: UIPageViewController, 
    willTransitionToViewControllers pageViewController: [AnyObject]) { 

     //       pageViewController is the pending View Controller 
     nextIndex = currentIndex 

     // pageViewController...... how do I get its index? 
} 

risposta

16

È necessario utilizzare entrambi i metodi delegato willTransitionToViewControllers: e didFinishAnimating: per determinare se la transizione è in avanti o indietro. Dichiarare un paio di variabili di indice all'inizio della classe, ad esempio currentIndex e nextIndex (entrambi Int).

Nel metodo willTransitionToViewControllers, impostare il nextIndex pari al itemIndex del attesa di controller della vista:

EDIT

func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) { 
    // the page view controller is about to transition to a new page, so take note 
    // of the index of the page it will display. (We can't update our currentIndex 
    // yet, because the transition might not be completed - we will check in didFinishAnimating:) 
    if let itemController = pendingViewControllers[0] as? PageItemController { 
     nextIndex = itemController.itemIndex 
    } 
} 

FINE EDIT

si può lavorare in questa indicare se la transizione sarà avanti o indietro: se nextIndex>currentIndex, quindi avanti; se nextIndex < currentIndex quindi indietro. Poi, nel didFinishAnimating, se completed è vero (così completato il passaggio alla successiva controller della vista), impostare currentIndex pari a nextIndex modo da poter utilizzare currentIndex ovunque è necessario indicare quale pagina è attualmente sullo schermo:

EDIT

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool) { 
    if (completed) { 
     // the page view controller has successfully transitioned to the next view 
     // controller, so we can update our currentIndex to the value we obtained 
     // in the willTransitionToViewControllers method: 
     currentIndex = nextIndex 

    } 
} 

si noti che il primo argomento di questi metodi è la pageViewController (istanza di UIPageViewController), non pageItemController che avete nel vostro codice attuale.

Infine, solo per notare: che enum si fa riferimento a (UIPageViewControllerNavigationDirection) viene utilizzato solo nel metodo setViewControllers(_, direction:).

FINE EDIT

+0

Grazie mille per aver risposto esattamente alla mia domanda. Mi permetta di spiegare come ottengo l'indice del ViewController in sospeso. Dici "... uguale al itemIndex del controller di visualizzazione in attesa", ma ho indizi su come farlo. Il resto della risposta è chiaro e ben messo - Grazie ancora! – Cesare

+0

@CeceXX Ho aggiornato la mia risposta con qualche codice di esempio. – pbasdf

+0

Non posso solo ringraziarti abbastanza! – Cesare

0

Non v'è alcun modo per determinare se l'utente ha fatto scorrere in avanti o all'indietro.

è necessario utilizzare questi due metodi per fornire il punto di vista prima e dopo:

pageViewController: viewControllerBeforeViewController:

pageViewController: viewControllerAfterViewController:

È possibile tenere traccia di un indice con l'aggiunta di una proprietà alla viewControllers e quindi è possibile confrontare la paginaIndexes.

+0

Come potrei esattamente farlo? "È possibile tenere traccia di un indice aggiungendo una proprietà a viewControllers e quindi è possibile confrontare il pageIndexes.". Grazie! – Cesare

+0

@CeceXX Il controller di visualizzazione avrebbe una proprietà chiamata pageIndex come questo tutorial: http://www.makemegeek.com/uipageviewcontroller-example-ios/ –

Problemi correlati