2012-01-05 11 views
18

मेरे पास एक UIPageViewController है और मैं यह नहीं समझ सकता कि उपयोगकर्ता ने पृष्ठ को किस दिशा में बदल दिया है, इसलिए मैं पेज गिनती को उचित रूप से सेट कर सकता हूं।मुझे कैसे पता चलेगा कि UIPageViewController आगे फिसल गया या उलट गया?

धन्यवाद शनि

उत्तर

0

उपयोगकर्ता द्वारा पृष्ठ UIPageViewController के setViewControllers: विधि बुलाया जाएगा बदल जाता है। इस विधि को UIPageViewControllerNavigationDirection का तर्क प्राप्त होता है जो आपको आवश्यक जानकारी देगा।

+15

कम से कम आईओएस 6 पर, '-setViewControllers: दिशा: एनिमेटेड: समापन:' संक्रमण को इशारा किया गया था अगर नहीं कहा जाता है। मैंने बस कोशिश की। – jrc

3

'पेज आधारित अनुप्रयोग' टेम्पलेट इन 2 तरीकों प्रदान करते हैं:

- (NSUInteger)indexOfViewController:(DataViewController *)viewController; 

सूचकांक दिया एक दृश्य नियंत्रक

- (DataViewController *)viewControllerAtIndex:(NSUInteger)index 

एक दृश्य नियंत्रक instantiating के लिए एक विधि एक सूचकांक दिया खोजने के लिए एक विधि ।

सही एनीमेशन बनाने के लिए, आपको अपने वर्तमान दृश्य नियंत्रक की अनुक्रमणिका जानने की आवश्यकता है। पेज-आधारित टेम्पलेट विधियां इसके लिए उपयुक्त हैं। फिर, आप बस अपनी 'जंप टू इंडेक्स' और अपनी 'वर्तमान' इंडेक्स की तुलना करें। previousViewControllers पैरामीटर की तुलना द्वारा

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: 

तो और pageViewController.viewControllers क्या आप जानते हैं कर सकते हैं: के बाद एक इशारे पर ही आधारित संक्रमण इस प्रतिनिधि method कहा जाता है पूरा करता

- (void)jumpToPage:(NSInteger)page {  
    // find current index 
    DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject]; 
    NSUInteger index = [self indexOfViewController:currentViewController]; 

    // choosing the correct direction 
    // if the 'current' is smaller than the 'jump to' page, then choose forward 
    // vice versa 
    UIPageViewControllerNavigationDirection direction; 
    if (index < page) { 
     direction = UIPageViewControllerNavigationDirectionForward; 
    } else { 
     direction = UIPageViewControllerNavigationDirectionReverse; 
    } 

    // choose view controllers according to the orientation 
    NSArray *viewControllers; 
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
     DataViewController *rightViewController = [self viewControllerAtIndex:page]; 
     viewControllers = [NSArray arrayWithObject:rightViewController]; 
    } else { 
     DataViewController *rightViewController = [self viewControllerAtIndex:page]; 
     DataViewController *leftViewController = [self viewControllerAtIndex:page-1]; 
     viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil]; 
    } 

    // fire the method which actually trigger the animation 
    [self.pageViewController setViewControllers:viewControllers 
            direction:direction 
             animated:YES 
            completion:nil]; 
} 
+0

मैं एक परिस्थिति के बारे में बात कर रहा हूं जब एनीमेशन देशी इशारा पहचानकर्ताओं द्वारा ट्रिगर किया जाता है। – shannoga

+0

क्या आपने अपना पेजव्यू कंट्रोलर डेटा स्रोत सेट किया है? दो विधियां हैं जिन्हें आपको कार्यान्वित करना चाहिए, '- पृष्ठ दृश्य नियंत्रक: viewControllerBeforeViewController:' पृष्ठ को पिछड़ा फ़्लिप करने पर कॉल किया जाता है, '- पृष्ठ दृश्य नियंत्रक: viewControllerAfterViewController:' जब पृष्ठ आगे फिसल जाता है तब कहा जाता है। क्या आप यह खोजने की कोशिश कर रहे हैं? मैं आपके प्रश्न को पूरी तरह से समझ नहीं पा रहा हूं, शायद आपको अपनी समस्या को और विस्तार से समझाएं। –

+0

मैं उन तरीकों का उपयोग कर रहा हूं। बात यह है कि मुझे एक वेरिएबल अपडेट करने की आवश्यकता है जो पेज नंबर धारण करे। मेरे पास ऑब्जेक्ट्स का ऐरे है जो मुझे दृश्य नियंत्रक को असाइन करने की आवश्यकता है और मुझे यह जानने की ज़रूरत है कि पेज नंबर क्या है ताकि मैं सही ऑब्जेक्ट प्राप्त कर सकूं। ऐसा करने के लिए मुझे यह जानने की ज़रूरत है कि उपयोगकर्ता वापस या आगे चला गया है, इसलिए मैं पृष्ठ संख्या को सही तरीके से अपडेट कर सकता हूं। – shannoga

7

:

यहाँ विचार प्राप्त करने के लिए कुछ कोड है दिशा।

+0

हाय हेजाज़ी, मैं दो सरणी की तुलना कर रहा हूं यदि ([पिछला दृश्य नियंत्रक है IqualToArray: pvc.viewControllers]) और मैं हमेशा झूठा हो जाता हूं (जब मैं पृष्ठ को दाएं या बाएं ओर चालू करता हूं), क्या मैं कुछ गलत कर रहा हूं? – Grace

+0

'पिछले दृश्य नियंत्रक' में हमेशा एक आइटम होता है, इसका उपयोग दिशाओं के बीच अंतर करने के लिए नहीं किया जा सकता है। – lambdas

+0

@lambdas जब तक आप किसी दिए गए व्यू कंट्रोलर से जुड़े पेज नंबर को जानते हैं, तब तक आप पिछले व्यू कंट्रोलर और वर्तमान व्यू कंट्रोलर (ओं) की जांच करके दिशा का पता लगा सकते हैं। – Hejazi

32

Hejazi रूप

कहा के बाद एक इशारे पर ही आधारित संक्रमण इस प्रतिनिधि method कहा जाता है पूरा करता है:

pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:

बात यह है कि होना चाहिए स्पष्ट किया गया है कि completedYES होगा यदि पृष्ठ पूरी तरह से चालू हो गया था औरहोगा 0 अगर पृष्ठ वास्तव में नहीं बदला था। NO केस होता है, उदाहरण के लिए, जब उपयोगकर्ता पृष्ठ के कोने को खींचता है और फिर पेज को फ़्लिप किए बिना इसे वापस रखता है।

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    // If the page did not turn 
    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 
    // [self sendPageChangeNotification:YES]; 
} 
+0

यह भी ध्यान दें कि ईवेंट समाप्त होने पर भी पृष्ठ वास्तव में परिवर्तित नहीं हो सकता है। उपयोगकर्ता आंशिक रूप से एक पृष्ठ चालू कर सकता है लेकिन पृष्ठ को बदलने के लिए पर्याप्त नहीं है, फिर एनीमेशन उन्हें उस पृष्ठ पर वापस ले जाएगा जो वे पहले से ही चालू थे। – diadyne

+1

@diadyne यहां दो बूल शामिल हैं- 'समाप्त' सच होगा यदि घटना समाप्त हो गई लेकिन क्रिसफ्लूफिव ने कहा, 'पूरा' इंगित करेगा कि उपयोगकर्ता पृष्ठ को चालू करता है या नहीं। – todd412

+0

यह उत्तर मुझे समाधान के करीब ले जाता है। आपके उत्तर के साथ जो 'इंडेक्स' है, वह अगला है जो समस्या को हल करने के लिए * होगा * संक्रमण करेगा। यह [उत्तर] (http://stackoverflow.com/a/27576378/571227) देखें कि अगली अनुक्रमणिका को कैसे जानें, यह कैसे बदल जाएगा। – haxpor

2

आप देखेंगे कि पृष्ठों के रूप में काम करते हुए अपने दृश्य नियंत्रकों के लिए एक "pageIndex" संपत्ति जोड़ सकते हैं:

इस अवधारणा को आप लागू करना चाहते हैं जाएगा। IOW, जब आप viewControllerBeforeViewController & viewControllerAfterViewController (या जब आप setViewControllers को कॉल करते हैं) के लिए व्यू कंट्रोलर बनाते हैं, तो उन दृश्य नियंत्रकों में एक पृष्ठ इंडेक्स स्टोर करें जिन्हें आप तब भी संदर्भित कर सकते हैं जब आपको इंडेक्स को जानना आवश्यक हो।

1

पेज नियंत्रक हैंडलिंग के लिए महान उत्तर। मैंने पाया कि एक पृष्ठ के रूप में जोड़ा गया व्यू कंट्रोलर व्यूविल्लएपियर को कॉल करेगा क्योंकि उपयोगकर्ता पृष्ठ को दृश्य में स्लाइड करता है और पूरा होने पर viewDidAppear को भी कॉल करेगा।

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