2012-11-13 36 views
13

मैं एक मामले में जहां आप के साथ या एनीमेशन के बिना कुछ कर सकते हैं संभाल करने की जरूरत के बजाय:UIView एनीमेशन ब्लॉक: यदि अवधि 0 है, तो क्या यह एनीमेशन के समान है?

if (animation) 
{ 
    [UIView animateWithBlock:^(){...}]; 
} 
else 
{ 
    ... 
} 

मैं क्या करना चाहते हैं:

[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)] 

लेकिन यकीन नहीं करता है, तो यह काम करता है, भले ही वह क्या, दृश्य को सीधे बदलने के बजाय इसका उपयोग करने के लिए कोई ओवरहेड है?

धन्यवाद

उत्तर

7

हाँ, के बाद से अवधि शून्य है, संक्रमण होगा प्रभावी रूप से तात्कालिक द्वारा।

+1

अवधि के बारे में किसी भी अधिक विचार करने के लिए और करता है इसका कोई उपर है? अर्थात। '[UIView एनिमेट विथब्लॉक: ^() {self.view.frame = newframe} अवधि के साथ: 0]' बनाम 'self.view.frame = newframe'? – hzxu

+0

आपको पहले फ्रेम सेट करने की आवश्यकता होगी ताकि यह किसी अन्य फ्रेम की तरह कार्य करे। - हाँ यह एक उपरि है। – PappaSmalls

+9

मैंने आईओएस 7.1.1 5 एस के साथ इसका परीक्षण किया और अंतर बहुत बड़ा है; 10k बार देखने के लिए एक यादृच्छिक फ्रेम सेट करना^एनिमेट विथब्लॉक:^और 0.05 सेकेंड के साथ ब्लॉक के लिए सीधे कॉल के साथ 22.85 सेकेंड लगे। हालांकि, अगर आप कुछ उपयोगकर्ता इंटरैक्शन के लिए केवल कुछ एनीमेशन कॉल को पूर्ववत कर रहे हैं, तो अंतर प्रासंगिक नहीं है। कृपया ध्यान दें कि ऐप्पल व्यवहार को बदल सकता है और भविष्य में इस एज केस को अनुकूलित कर सकता है। – mkko

27

मैं इन मामलों में क्या करता हूं, वह ब्लॉक बनाना है जिसमें सभी एनिमेशन शामिल हैं जिन्हें मैं बनाना चाहता हूं। फिर एनीमेशन ब्लॉक को पैरामीटर के रूप में पास करने वाली एक UIView एनीमेशन निष्पादित करें, या उस ब्लॉक को सीधे कॉल करें, चाहे मैं इसे एनिमेटेड होना चाहूंगा या नहीं। कुछ इस तरह:

void (^animationBlock)(); 
animationBlock=^{ 
     // Your animation code goes here 
}; 
if (animated) { 
    [UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) { 

    }]; 
}else{ 
    animationBlock(); 
} 

से बच जाएंगे कि भूमि के ऊपर

+0

यह –

+0

कीफ्रेम के साथ काम नहीं करेगा यह एक सुरुचिपूर्ण समाधान है। धन्यवाद। – GeneCode

18

एप्पल डॉक्स के अनुसार:

तो एनीमेशन की अवधि 0 है, इस ब्लॉक की शुरुआत में किया जाता है अगला रन लूप चक्र।

+1

तो एनीमेशन कथन निष्पादित होने के समय से वास्तव में 0 देरी नहीं हो सकती है? – hzxu

+0

@hzxu बिल्कुल। प्रभाव '[स्वयं प्रदर्शन चयनकर्ता: @ चयनकर्ता (एनिमेट) को कॉल करने के समान ही है: 0] – chebur

+0

मैं पुष्टि कर सकता हूं कि यह वास्तव में मामला है। 0 का उपयोग एनिमेटिंग और इसे तुरंत करने के बराबर नहीं है। – strange

0

आप आवश्यकता के अनुसार गतिशीलता मूल्य गतिशील रूप से सेट कर सकते हैं।

यदि आप 0 सेट करते हैं तो इसका मतलब है कि कोई एनीमेशन संक्रमण समय नहीं है। इसलिए, दृश्य किसी भी एनीमेशन के बिना दिखाई देगा। यदि आप एनीमेशन प्रदान करना चाहते हैं, तो 0 से अधिक मान निर्धारित करें।

**float animationDurationValue=0.03f; 
     [UIView animateWithDuration:x delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
animations:^{ 
          [yourView setFrame:CGRectMake(0.0f, 100.0f, 300.0f, 200.0f)]; 
         } 
         completion:nil];** 

कृपया मुझे कोई समस्या होने पर बताएं।

2

ठीक है, मेरे पास इस पर और अवलोकन है। फर्स्ट, शून्य अवधि के साथ एनीमेशन का उपयोग करते समय एक प्रदर्शन ओवरहेड होता है लेकिन अधिक गहरा अंतर यह है कि एनीमेशन के समापन ब्लॉक को एसिंक को संभाला जाता है। इसका मतलब यह है कि पहले छिपाने और फिर दृश्य को प्रदर्शित करने से आपको नतीजे मिलेगा।

तो, नहीं, मैं निश्चित रूप से एक अवधि के रूप में शून्य का उपयोग न करने का सुझाव दूंगा क्योंकि यह तुल्यकालिक नहीं है।

1

मैं इस मुद्दे पर काबू पाने के इस छोटे से स्विफ्ट विस्तार लिखा है:

extension UIView { 

/// Does the same as animate(withDuration:animations:completion:), yet is snappier for duration 0 
class func animateSnappily(withDuration duration: TimeInterval, animations: @escaping() -> Swift.Void, completion: (() -> Swift.Void)? = nil) { 
    if duration == 0 { 
     animations() 
     completion?() 
    } 
    else { 
     UIView.animate(withDuration: duration, animations: animations, completion: { _ in completion?() }) 
    } 
} 
} 

एक UIView.animate(withDuration:animations:completion) के लिए एक स्थानापन्न के रूप में उपयोग कर सकते हैं और नहीं है 0.

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

  • कोई संबंधित समस्या नहीं^_^