2013-04-28 10 views
24

मैं नए याहू मौसम ऐप में पाए गए प्रभाव के समान प्रभाव डालने की कोशिश कर रहा हूं। असल में, UIPageViewController में प्रत्येक पृष्ठ की पृष्ठभूमि छवि होती है, और जब पृष्ठ दृश्य के माध्यम से स्क्रॉल करते हैं, तो छवि का स्थान केवल आधा गति तक स्क्रॉल करता है। मुझे यह कैसे करना है? मैंने सोचा कि मैं वर्तमान ऑफसेट प्राप्त करने के लिए UIPageViewController में कुछ प्रकार के प्रतिनिधि विधि का उपयोग कर सकता हूं और फिर उस तरह की छवियों को अपडेट कर सकता हूं। एकमात्र समस्या यह है कि मुझे यह बताने के लिए कोई रास्ता नहीं मिल रहा है कि UIPageViewController स्क्रॉल किया जा रहा है या नहीं! क्या इसके लिए कोई विधि है? धन्यवाद!बताएं कि जब एक UIPageViewController स्क्रॉल कर रहा है (किसी छवि के लंबन स्क्रॉलिंग के लिए)

उत्तर

46
for (UIView *view in self.pageViewController.view.subviews) { 
    if ([view isKindOfClass:[UIScrollView class]]) { 
     [(UIScrollView *)view setDelegate:self]; 
    } 
} 

यह आप सभी मानक स्क्रॉल दृश्य एपीआई तरीकों तक पहुँच देता है। और यह निजी ऐप्पल एपीआई का उपयोग नहीं कर रहा है।

मैं subviews के माध्यम से traversing कहा, 100% UIPageViewController के भीतरी स्क्रॉल दृश्य चेतावनी लगता है: scrollview.contentOffset से सावधान रहें। यह नया पृष्ठ

के नियंत्रक स्क्रॉल के रूप में रीसेट करता है आप persision scrollview ट्रैकिंग ऑफसेट और ऐसे सामान, यह संग्रह दृश्य ही है और पेजिंग सक्षम के रूप में आकार कोशिकाओं के साथ एक UICollectionViewController उपयोग करने के लिए बेहतर होगा की जरूरत है।

+7

यदि ऐप्पल अपने पृष्ठ दृश्य नियंत्रक के आर्किटेक्चर को बदलता है तो आप खराब हो जाते हैं। –

+1

@ वानडुट्रान सहमत हुए, लेकिन तब तक, यह सब अच्छा है, और सबसे अच्छा दृष्टिकोण की तरह लगता है। मुझे कोई विकल्प नहीं दिख रहा है –

+3

यह मेरे लिए पहला सबव्यू नहीं था, लेकिन दूसरा। इस कोड ने यह किया: 'अगर ([self.pageVC.view.subviews [1] प्रतिसाद देता है तो चयनकर्ता: @ चयनकर्ता (सेट डिलीगेट:)]) { [self.pageVC.view.subviews [1] setDelegate: self]; } ' – Whoa

3

मेरा अनुमान है कि यह एक UIPageViewController नहीं है, बल्कि एक पेजेड UIScrollView है। UIScrollView आपको लगातार बार-बार प्रतिनिधि पद्धति देता है जो स्क्रॉलिंग के रूप में क्या हो रहा है ट्रैक करता है।

वैकल्पिक रूप से, आप कि UIPageViewController चुपके से उपयोग कर रहा है पृष्ठांकित UIScrollView उपयोग करने में सक्षम हो सकता है, लेकिन आप कुछ तोड़ सकता है, और मुझे यकीन है कि कैसे एप्पल इसके बारे में लगेगा नहीं हूँ।

+1

एक UIPageViewController के साथ ऐसा करने के लिए एक तरीका होना चाहिए। अगर मैं इसका इस्तेमाल करता हूं तो यह सब कुछ सरल बनाता है। याहू ऐप ऐसा लगता है कि यह यूआईपीएज व्यू कंट्रोलर का भी उपयोग करता है। UIViewController के भीतर से स्क्रीन को ऑनस्क्रीन पाने का कोई तरीका है? –

+1

क्या UIPageViewController मूल रूप से केवल एक फैंसी UIScrollView नहीं है? –

+0

यह आपके लिए आसान हो सकता है, लेकिन मैं आपको आश्वासन देता हूं कि अकेले UIScrollView के साथ हम स्क्रॉल-शैली UIPageViewController जैसे स्क्रॉल-शैली UIPageViewController मौजूद होने से पहले सामान कर रहे थे। पूरे डब्ल्यूडब्ल्यूडीसी वीडियो हैं जो यह समझाने के लिए समर्पित हैं कि इसे कैसे किया जाए। – matt

1

जो आप खोज रहे हैं उसे लंबन स्क्रॉलिंग कहा जाता है, आप कई पुस्तकालयों को पा सकते हैं जो आपकी मदद कर सकते हैं।

संपादित करें: मैट सही है यह एक जवाब नहीं है, केवल एक संकेत है।

एक पृष्ठभूमि छवि है कि आपके UIPageViewController आप प्रतिनिधि तरीकों का उपयोग करना चाहिए के पीछे रखना है कि यह पेशकश करते हैं एनिमेट के लिए::

-[id<UIPageViewControllerDelegate> pageViewController:willTransitionToViewControllers:] 
-[id<UIPageViewControllerDelegate> pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:] 

इन दोनों तरीकों के साथ आप स्क्रॉल का प्रतिशत की गणना कर सकते हैं (आप वैसे भी इसे पूरा करते हैं अपने सरणी में अपने नियंत्रकों की दुकान को पता है जो नियंत्रक पर आप के लिए स्क्रॉल और प्रतिशत मिलना चाहिए)

+3

यह कोई जवाब नहीं है। – matt

+1

आप इससे प्रतिशत कैसे प्राप्त करेंगे? –

+1

आपको '- [एनएसएआरएआर इंडेक्सऑफ ऑब्जेक्ट:]' के साथ खोजे गए व्यू कंट्रोलर की स्थिति प्राप्त करनी चाहिए, फिर आप '- [एनएसएआरआरई गिनती] ' –

12

मैं यह कर जाएगा:

ऑब्जेक्टिव-सी

for (UIView *v in self.pageViewController.view.subviews) { 
    if ([v isKindOfClass:[UIScrollView class]]) { 
     ((UIScrollView *)v).delegate = self; 
    } 
} 

और इस प्रोटोकॉल

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

स्विफ्ट को लागू

for view in self.pageViewController.view.subviews { 
    if let scrollView = view as? UIScrollView { 
    scrollView.delegate = self 
    } 
} 

और इस प्रोटोकॉल

func scrollViewDidScroll(scrollView: UIScrollView) 
+0

स्विफ्ट कोड टुकड़े के लिए धन्यवाद –

2

उपयोग @ पॉल स्निपेट को लागू -

for (UIView *v in self.pageViewController.view.subviews) { 
if ([v isKindOfClass:[UIScrollView class]]) { 
    ((UIScrollView *)v).delegate = self; 
} 
} 

इस प्रोटोकॉल को लागू करने के लिए: -(void)scrollViewDidScroll:(UIScrollView *)scrollView

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
CGPoint point = scrollView.contentOffset; 

float percentComplete; 
percentComplete = fabs(point.x - self.view.frame.size.width)/self.view.frame.size.width; 
NSLog(@"percentComplete: %f", percentComplete); 
} 

यह आपको पुस्तक का प्रतिशत पूरा होने देता है। हैप्पी कोडिंग!

1

स्विफ्ट 3 में आप यह भी कम लिख सकते हैं:

if let scrollView = self.pageViewController.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView { 
    scrollView.delegate = self 
} 
0
extension UIPageViewController { 

    var scrollView: UIScrollView? { 

     return view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView 
    } 
} 

का उपयोग करना:

pageController.scrollView?.delegate = self 
संबंधित मुद्दे