2015-01-13 5 views
6

में उपयोगकर्ता स्वाइपिंग दिशा प्राप्त करें UIPageViewControllerDataSource के इन दो विधियों viewControllerBeforeViewController और viewControllerAfterViewController स्वाइप की दिशा न बताएं।UIPageViewController

UIPageViewController प्रतिनिधि का तरीका transitionCompleted प्रतिनिधि हमारी मदद नहीं करता है। यह सिर्फ बताता है कि पृष्ठ पूरी तरह से स्वाइप किया गया था या नहीं।

तो उपयोगकर्ता की दिशा (बाएं या दाएं) का पता लगाने के लिए मुझे किस विधि का उपयोग करना चाहिए?

शायद इन दो गुण मदद मिल सकती है:

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

मेरे कोड इस तरह दिखता है:

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

    } 
} 
} 

को pbasdf क्या कहा,

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

उत्तर

16

आपको willTransitionToViewControllers: और didFinishAnimating: प्रतिनिधि विधियों का उपयोग करना चाहिए ताकि यह कार्य किया जा सके कि संक्रमण आगे या पीछे है या नहीं। अपनी कक्षा की शुरुआत में कुछ इंडेक्स वैरिएबल घोषित करें, currentIndex और nextIndex (Int दोनों) कहें।

संपादित

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

अंत संपादित

आपने इस पर काम कर सकते हैं:

willTransitionToViewControllers विधि में, nextIndex लंबित दृश्य नियंत्रक के itemIndex के बराबर सेट इंगित करें कि संक्रमण आगे या पिछड़ा होगा: यदि nextIndex>currentIndex, फिर आगे; यदि nextIndex < currentIndex फिर पिछड़ा। तब didFinishAnimating में, अगर completed सच है, (इसलिए यह अगले दृश्य नियंत्रक के लिए संक्रमण पूरा) currentIndex बराबर सेट nextIndex ताकि आप currentIndex उपयोग कर सकते हैं भी आप से संकेत मिलता है जो पृष्ठ वर्तमान में स्क्रीन पर है की जरूरत है:

संपादित

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 

    } 
} 

ध्यान दें कि इन तरीकों को पहला तर्क pageViewController (UIPageViewController का उदाहरण), नहीं pageItemController जो आप अपने वर्तमान कोड में है।

अंत में, बस ध्यान दें: कि आप जिस संदेश को संदर्भित करते हैं (UIPageViewControllerNavigationDirection) का उपयोग केवल setViewControllers(_, direction:) विधि में किया जाता है।

अंत संपादित

+0

मेरे प्रश्न का उत्तर देने के लिए बहुत बहुत धन्यवाद। क्या आप कृपया बताएं कि लंबित दृश्य नियंत्रक की अनुक्रमणिका कैसे प्राप्त करें। आप कहते हैं "... लंबित दृश्य नियंत्रक के आइटम इंडेक्स के बराबर", लेकिन मुझे यह कैसे करना है इसके बारे में सुराग है। बाकी का जवाब स्पष्ट और अच्छी तरह से रखा गया है - धन्यवाद फिर से! – Cesare

+0

@CeceXX मैंने कुछ नमूना कोड के साथ अपना जवाब अपडेट किया है। – pbasdf

+0

मैं आपको बस इतना धन्यवाद नहीं कर सकता! – Cesare

0

निर्धारित करने के लिए कोई तरीका नहीं है अनुसार चाहे उपयोगकर्ता आगे या पीछे स्वाइप हो।

pageViewController: viewControllerBeforeViewController:

pageViewController: viewControllerAfterViewController:

आप इन दोनों तरीकों का उपयोग करने के विचारों से पहले और बाद उपलब्ध कराने की आवश्यकता

तो आप प्रॉपर्टी को जोड़कर एक सूचकांक का ट्रैक रख सकते देखने के लिए नियंत्रक और फिर आप पेज इंडेक्स की तुलना कर सकते हैं।

+0

मैं कैसे बिल्कुल ऐसा होगा? "आप व्यू कंट्रोलर को एक संपत्ति जोड़कर एक इंडेक्स का ट्रैक रख सकते हैं और फिर आप पेज इंडेक्स की तुलना कर सकते हैं।"। धन्यवाद! – Cesare

+0

@CeceXX व्यू कंट्रोलर के पास इस ट्यूटोरियल की तरह पेजइंडेक्स नामक एक संपत्ति होगी: http://www.makemegeek.com/uipageviewcontroller-example-ios/ –

संबंधित मुद्दे