2013-08-22 5 views
6

के लिए मुखौटा एनिमेट करना मैं इस तरह एक मुखौटा बना सकते हैं:एक UIView

CALayer *mask = [CALayer layer]; 
    mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage]; 
    mask.frame = CGRectMake(0, 0, 10, 10); 
    self.content.layer.mask = mask; 

और यह सही ढंग से पता चलता है शीर्ष मेरी सामग्री का 10 पिक्सल छोड़ दिया (क्योंकि mask.png सिर्फ एक काले रंग की छवि है)। हालांकि मैं की शेष सामग्री प्रकट करने के लिए मुखौटा चेतन करना चाहते हैं:

[UIView animateWithDuration:3.0 
        animations:^{ 
         mask.frame = self.content.bounds; 
        } 
        completion:^(BOOL finished){ 

        }]; 

समस्या नहीं एनीमेशन है कि वहाँ है। पूरी सामग्री तुरंत प्रदर्शित हो जाती है। ऐसा क्यों होता है, और मैं मास्क को कैसे एनिमेट कर सकता हूं ताकि सामग्री ऊपरी बाईं ओर से प्रकट हो सके?

उत्तर

14

फ्रेम कई अन्य गुणों, जैसे स्थिति, सीमाएं, एंकरपॉइंट, और किसी भी रूपांतरित पर लागू होता है, की एक व्युत्पन्न संपत्ति है। इस संपत्ति को सीधे एनिमेट करने की अनुशंसा नहीं की जाती है, खासकर जब निम्न स्तर कोरएनीमेशन परतों से निपटना।

इस मामले में, मुझे लगता है कि आप सीमाओं को एनिमेट करना चाहते हैं। आप ऊपर UIView एनीमेशन विधि का उपयोग कर सकते हैं, लेकिन सीधे CALayers से निपटने पर मैं एनीमेशन के CoreAnimation विधियों का उपयोग करना पसंद करता हूं।

CGRect oldBounds = mask.bounds; 
CGRect newBounds = self.content.bounds; 

CABasicAnimation* revealAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
revealAnimation.fromValue = [NSValue valueWithCGRect:oldBounds]; 
revealAnimation.toValue = [NSValue valueWithCGRect:newBounds]; 
revealAnimation.duration = 3.0; 

// Update the bounds so the layer doesn't snap back when the animation completes. 
mask.bounds = newBounds; 

[mask addAnimation:revealAnimation forKey:@"revealAnimation"]; 
+0

यह काम करता है, आंशिक रूप से। मैं अब एनीमेशन देख सकता हूँ। हालांकि यह पूरे सामग्री दृश्य को प्रकट करने के बजाय लगभग आधा रास्ते बंद हो जाता है। क्या आप जानते हैं कि ऐसा क्यों हो सकता है? – soleil

+0

मुझे ईमानदार होने की ज़रूरत नहीं है; सामग्री की सीमाओं के भीतर मूल्य को दोबारा जांचें सही हैं। मैं थोड़ी अधिक मजबूत होने का उत्तर भी दूंगा। – WDUK

+0

असल में यह एंकर पॉइंट (कुछ कारणों से 0.5, 0.5 के लिए डिफ़ॉल्ट) के कारण था। यह इसे ठीक करता है: mask.anchorPoint = CGPointMake (0, 0); – soleil