2012-06-10 11 views
25

जब आप वास्तव में अगले पृष्ठ पर स्क्रॉल करते हैं तो मैं पेजिंग सक्षम के साथ स्क्रॉलव्यू की चिकनी एनीमेशन को पुन: पेश करने की कोशिश कर रहा हूं। ऐसा लगता है कि यह UIViewAnimationCurveEaseInOut है, लेकिन मुझे "अगला पृष्ठ" बटन होना चाहिए और स्क्रॉल को प्रोग्रामेटिक रूप से ट्रिगर करना होगा।गैर रेखीय एनीमेशन के साथ UIScrollview setContentOffset?

यहाँ मेरी कोड है:

-(void) scrollToPage:(int)page 
{ 
    UIScrollView *scrollView = contentView; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y); 
    [scrollView setContentOffset:offset animated: YES];  
    [self pageControlUpdate]; 
} 

-(void) scrollToNextPage 
{ 
    [self scrollToPage:(pageControl.currentPage + 1)]; 
} 

मैं UIViewAnimationCurveEaseInOut की चिकनाई पुन: पेश करने, या तो setContentOffset साथ प्रबंधन नहीं कर सकते, या scrollRectToVisible ... साथ यह एक बदसूरत रैखिक एनीमेशन

के साथ अगले पृष्ठ पर जाता है

मैं भी इसे मैन्युअल रूप से चेतन करने की कोशिश की:

[UIView animateWithDuration:.5 delay:0 options:UIViewAnimationCurveEaseInOut animations:^{ 
    scrollView.contentOffset = offset; 
} completion:^(BOOL finished) { } ]; 

मैं कहाँ गलत हूँ?

+0

मुझे यह मिला: http://developer.apple.com/library/ios/#DOCUMENTATION/WindowsViews/Conceptual/UIScrollView_pg/ScrollingViewContent/ScrollingViewContent.html जो मैंने देखा है की पुष्टि करता है: 'सेटकंटेंट ऑफसेट: एनिमेटेड: विधि स्क्रॉल करता है निर्दिष्ट सामग्री ऑफसेट के लिए सामग्री। यदि एनिमेटेड पैरामीटर हाँ है, तो स्क्रॉलिंग वर्तमान स्थिति से निरंतर दर पर निर्दिष्ट स्थिति तक एनिमेट हो जाएगी। – Diwann

+0

तर्क। कोई भी कोई सुराग नहीं हो सकता है? – Diwann

+0

ठीक है, अगर 'UIViewAnimationCurveEaseInOut' काम नहीं करता है तो यह शायद एक अलग एनीमेशन वक्र है। यह बहुत संभव है कि ऐप्पल इस एनीमेशन के लिए एक कस्टम वक्र का उपयोग करता है। 'CAPropertyAnimation' का उपयोग करके, आप 'CAMediaTimingFunction' के रूप में अपना स्वयं का कस्टम वक्र परिभाषित कर सकते हैं। विभिन्न नियंत्रण बिंदुओं के साथ खेलना लायक हो सकता है। –

उत्तर

21

हर बार जब आप अपनी खुद की एनिमेशन बनाने आप नहींanimated: पैरामीटर के रूप में पारित करने के लिए है:

- (void)scrollToPage:(int)page 
{ 
    UIScrollView *scrollView = contentView; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, 
           scrollView.contentOffset.y); 

    [UIView animateWithDuration:.5 
          delay:0 
         options:UIViewAnimationCurveEaseInOut 
        animations:^{ 
         [scrollView setContentOffset:offset animated:NO]; 
        } completion:nil]; 

    [self pageControlUpdate]; 
} 
+0

और बीटीडब्ल्यू। कुछ मामलों में एक फिक्स एनीमेशन समय अजीब लगेगा। जैसे आप केवल 2 लाइनों को स्क्रॉल करते हैं, इसमें आधे सेकेंड भी लगेंगे। और दूसरी दिशा यदि आपके पास वास्तव में, वास्तव में लंबी सूची है और आप ऊपर से नीचे तक स्क्रॉल करते हैं तो यह आधे सेकेंड में सुपर फास्ट होगा। –

+0

इस स्पष्टीकरण के लिए धन्यवाद लेकिन मैं केवल एक पूर्ण पृष्ठ चौड़ाई से स्क्रॉल करता हूं, इसलिए यह हमेशा एक ही गति लगता है। मैंने एनिमेटेड के साथ प्रयास किया: कोई पैरामीटर नहीं, लेकिन यह निश्चित दर पर स्क्रॉलिंग रखता है। मैंने UIViewAnimationCurve एनिमेशन को बदलने की भी कोशिश की लेकिन यह वही दिखता है। मैं ओले के कस्टम कैप्रोपर्टीएनीमेशन समाधान की कोशिश कर रहा हूं। – Diwann

+0

यह बहुत अच्छा काम करता है। हालांकि छोटे नाइटपिक, यह UIViewAnimationOptionCurveEaseInOut होना चाहिए। –

6
सार्वजनिक एपीआई के उपयोग के साथ

, मैं नहीं मानता कि यह वर्तमान में संभव है। मान लीजिए कि आपको एनीमेशन के दौरान उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है, तो आप इसके के सबव्यूज़ (यानी स्क्रॉल व्यू की सामग्री) की स्थिति को एनिमेट करने से बेहतर होंगे, और फिर पूरा होने पर एनीमेशन के बिना contentOffset समायोजित करना बेहतर होगा। आप इसे ऐसा कर सकते हैं:

- (void) scrollToPage:(int)page { 
    UIScrollView *scrollView = contentView; 
    scrollView.userInteractionEnabled = NO; 
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y); 
    CGFloat delta = offset.x - scrollView.contentOffset.x; 

    __block int animationCount = 0; 
    for (UIView *view in scrollView.subviews) { 
     [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      animationCount++; 
      CGRect frame = view.frame; 
      frame.origin.x -= delta; 
      view.frame = frame; 
     } completion:^(BOOL finished) { 
      animationCount--; 
      if (animationCount == 0) { 
       scrollView.contentOffset = offset; 
       for (UIView *view in scrollView.subviews) { 
        CGRect frame = view.frame; 
        frame.origin.x += delta; 
        view.frame = frame; 
       } 
       scrollView.userInteractionEnabled = YES; 
      } 
     }]; 
    } 
} 

मैं उम्मीद के अनुसार इस काम की पुष्टि कर सकता हूं, मैंने इसे स्वयं परीक्षण किया।

MOScroll on GitHub.com

यह

- (void)setContentOffset:(CGPoint)contentOffset withTimingFunction:(CAMediaTimingFunction *)timingFunction duration:(CFTimeInterval)duration;

बस निजी API जैसे लेकिन सभी सार्वजनिक तरीकों और गणित के साथ

है:

+0

हां, यह एक दिलचस्प वैकल्पिक समाधान है। लेकिन मुझे स्क्रॉलिंग के दौरान स्क्रॉलव्यू के अंदर अपना दृश्य स्थानांतरित करने के लिए रीयलटाइम सामग्री ऑफ़सेट मान का उपयोग करने की आवश्यकता है, और यह समाधान scrollviewdidscroll को ट्रिगर नहीं करता है। – Diwann

+0

वैसे यह अंत में 'contentOffset' सेट करते समय 'scrollViewDidScroll' को ट्रिगर करता है। लेकिन आप 'scrollViewDidScroll' में जो भी अतिरिक्त हैंडलिंग करते हैं उसे निकालें और इसके बजाय इसे इस विधि के भीतर उपयोग करें। –

+0

वैकल्पिक रूप से, आप अपने सभी 'UIScrollView' सबव्यूज़ को किसी अन्य' UIView' में एम्बेड कर सकते हैं, जिसे आप उपclass और 'setFrame:' ओवरराइड कर सकते हैं, क्योंकि एनीमेशन के दौरान यह अनिवार्य रूप से 'scrollViewDidScroll' के बराबर होगा। –

4
[UIView animateWithDuration:(Animation_Duration) 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
        [scroll setContentOffset:CGPointMake(PointX, PointY) animated:NO]; 
         } 
        completion:^(BOOL finished){}];` 
3

इस वर्ग पूरी तरह से मेरी जान बचाई।

+0

MOScroll के लिए कार्य लिंक: https://github.com/plancalculus/MOScrollView – Koen

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