2010-09-01 9 views
14

मेरे पास UIScrollView सबक्लास है कि मैं UIView एनिमेशन का उपयोग करके प्रोग्रामेटिक स्क्रॉलिंग कर रहा हूं।एनीमेशन के दौरान UIScrollView टच इवेंट एनीमेट के साथ फायरिंग नहीं करता हैथिथेशन: लेकिन UIView के साथ ठीक काम करता है एनीमेशन:

मैं चाहता हूं कि उपयोगकर्ता स्क्रॉल व्यू की UIImageView सामग्री में टैप या ज़ूम करने में सक्षम हो, जबकि एनीमेशन हो रहा है।

यह ठीक काम किया है एक निर्माण इस के लिए समान का उपयोग करते समय:

- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond { 
    // distance in pixels/speed in pixels per second 
    float animationDuration = _scrollView.contentSize.width/thePixelsPerSecond; 

    [UIView beginAnimations:@"scrollAnimation" context:nil]; 
    [UIView setAnimationCurve: UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:animationDuration]; 
    _scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0); 
    [UIView commitAnimations]; 
} 

अब, iOS 4.0 के बाद से, UIView beginAnimations: हतोत्साहित किया जाता है। इसलिए मैंने ब्लॉक और UIView एनिमेट का उपयोग करके अपना कोड अपडेट करने का प्रयास किया। अवधि: स्क्रॉलिंग उपर्युक्त के समान काम करती है।

कुंजी और कष्टदायक अंतर यह है कि एनीमेशन के दौरान, UIScrollView और अन्य विचार न अब घटना से निपटने के तरीकों का जवाब है:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 

ना ही: जब करने की कोशिश कर

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; 

कहा जाता हो ज़ूम।

स्पष्टता के लिए संपादित करें: कोई UIView वर्तमान घटनाओं को स्पर्श करने का जवाब नहीं देता है। यह केवल UIScrollView तक ही सीमित नहीं है। UIScrollView के सहकर्मी एक यूआईटीूलबार स्पर्श घटनाओं का जवाब नहीं देता है, न ही अन्य बटन जो यूआईएसक्रोल व्यू के साथ एक सहकर्मी के सबव्यूव्यू हैं। ऐसा लगता है कि संपूर्ण पेरेंट UIView उपयोगकर्ता इंटरैक्शन से जमे हुए है जबकि एनीमेशन पर जा रहा है। फिर, एनीमेशन पूर्ण होने के बाद, उपरोक्त सभी UIViews फिर से उत्तरदायी हैं।

इन सभी को UIView प्रारंभ में कहा जाता हैएनीमेशन: एनीमेशन स्थिति के बावजूद फॉर्मूलेशन।

मेरा एनिमेटथिथेशन: कोड थोड़ा अलग है - लेकिन मतभेद सामग्री नहीं हैं। जैसे ही एनीमेशन पूर्ण कर देती है, ऊपर स्पर्श इवेंट फिर से कहा जाता है ...

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

- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{ 

    float animationDuration = theSyncPoint.time - [player currentTime]; 
    [UIView animateWithDuration:animationDuration 
          delay:0 
         options:UIViewAnimationOptionCurveLinear 
        animations:^{ 
     [_scrollView setContentOffset:theSyncPoint.contentOffset]; 
    } 
        completion:^(BOOL finished){ 
         if (theContinueFlag) { 
          SyncPoint *aSyncPoint = [self nextSyncPoint]; 
          if (aSyncPoint) { 
           [self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES]; 
          } 
         } 
    }]; 
} 

केवल ईवेंट हैंडलर कि ऊपर एनीमेशन ब्लॉक के दौरान आग है:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

तो, प्रश्न: क्या मुझे ऐप्पल के को लेबल को हतोत्साहित करना चाहिए और शुरुआत एनीमेशन फॉर्मूलेशन का उपयोग करना जारी रखना चाहिए? क्या मुझे हिटटेस्ट का उपयोग करके ज़ूमिंग और मेरे अन्य टच-आधारित ईवेंट को दोबारा बनाना चाहिए? क्या एनीमेशन ब्लॉक के बीच कार्यान्वयन में अंतर का कुछ ज्ञान है जो मुझे इस समस्या का सामना करने में मदद कर सकता है? क्या कुछ स्पष्ट है कि मुझे याद आ रही है?

मैं ऐप्पल के लिए एक नया डेवलपर हूं, और इसलिए मुझे नहीं पता कि को टैग को कितना गंभीरता से लेना है। लेकिन अगर इस एपीआई को हटा दिया जाएगा तो गायब हो जाएगा, मैं एक स्थायी दिशा में आगे बढ़ना चाहता हूं।

आपके ध्यान के लिए बहुत बहुत धन्यवाद।

+0

यह स्थिति वास्तव में कम स्मृति स्थिति द्वारा संकेतित प्रतीत होती है। मेरे पास व्यापक रूप से परीक्षण करने का समय नहीं है यदि यह वास्तव में कारण है (इसलिए मैंने अभी तक सवाल का जवाब नहीं दिया है)। लेकिन, कम स्मृति स्थितियों के दौरान ईवेंट-हैंडलिंग के समान निलंबन का अनुभव करने के बाद, यह वास्तव में दिखाई देगा कि यह हो रहा है। अब - ब्लॉक-आधारित एनीमेशन क्यों प्रभावित होगा जबकि दूसरा नहीं है ... जब मैं समय और पोस्ट प्राप्त करता हूं तो मैं एक व्यापक परीक्षण चलाऊंगा। – Jackifus

उत्तर

41

तुम बस जब इतनी तरह एनीमेशन लागू UIViewAnimationOptionAllowUserInteraction विकल्प शामिल करने की जरूरत:

[UIView animateWithDuration:animationDuration 
          delay:0 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        <snip>]; 

एक डरपोक एक है यही कारण है कि, मुझे पता है! ;)

पुन: "निराश" टैग - सामान्य रूप से, जब ऐप्पल आपको अपने प्लेटफार्मों पर चलने वाले अनुप्रयोगों को डिजाइन करने के संबंध में कुछ नहीं करने के लिए कहता है, तो यह आमतौर पर आपके स्वयं के लिए अच्छा होता है। तो आप कट्टरपंथी पुराने तरीके के बजाय एनीमेशन ब्लॉक को अपनाने के इच्छुक हैं।

+0

वास्तव में स्नीकी - बहुत बहुत धन्यवाद! – Jackifus

+0

प्रतीक्षा करें, आपका मतलब है कि ब्लॉक आधारित एनिमेशन ब्लॉकिंग हैं? यह एक कोड पन की तरह है! (क्षमा करें, विरोध नहीं कर सका। +1 बहुत उपयोगी उत्तर के लिए) – Bdebeez

+0

उत्कृष्ट उत्तर, बहुत बहुत धन्यवाद! – joern