2012-04-26 8 views
5

कुछ कारणों से, मैं ऐसा करने के लिए एक CAScrollLayer का उपयोग करने से बचने की कोशिश कर रहा हूं। जिस प्रभाव के बाद मैं जा रहा हूं वह प्रगतिशील रूप से प्रकट होता है (नीचे से ऊपर तक) एक कैलियर की सामग्री (एक पीएनजी जिसे मैंने पहले लोड किया था)। इसलिए मैं यह कर के बारे में सोचा:मैं एक छवि को प्रगतिशील रूप से प्रकट करने के लिए कैवेलर की सीमाओं को कैसे एनिमेट कर सकता हूं?

layer.anchorPoint = CGPointMake(.5, 1); 
    CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"]; 
    a.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    a.fillMode = kCAFillModeBoth; 
    a.removedOnCompletion = NO; 
    a.duration = 1; 
    a.fromValue = [NSNumber numberWithFloat:0.]; 
    a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height]; 
    [layer addAnimation:a forKey:nil]; 

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

कोई विचार यह है कि इसे कैसे खींचें या मैं क्या खो सकता हूं?

उत्तर

3

ठीक है, मैं यह काम करने के लिए मिल गया है, लेकिन मैं मूल रूप से भी परत के फ्रेम अद्यतन करने के लिए, लंगर बिंदु में परिवर्तन को प्रतिबिंबित करने के लिए किया था:

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
    layer.contentsGravity = kCAGravityTop; 
    layer.masksToBounds = YES; 
    layer.anchorPoint = CGPointMake(.5, 1); 
    CGRect newFrame = layer.frame; 
    newFrame.origin.y += newFrame.size.height/2; 
    layer.frame = newFrame; 
    [CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions]; 

    a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height]; 
    [layer addAnimation:a forKey:nil]; 
0

आप लक्ष्य छवि पर एक और छवि डाल सकते हैं और इसे एक मंच पर्दे की तरह ले जा सकते हैं।

+0

मैं, लेकिन एक से अधिक स्तर पर दक्षता की वजह से जानते हैं (वहाँ कर सकते हैं इस प्रभाव में से कुछ बार एक बार चल रहे हैं और मुझे खुद को कैलियर से निपटने की ज़रूरत है) मैंने इस तरह से नहीं जाने का फैसला किया। अब मैं contentRect के साथ प्रयोग कर रहा हूं, और मैं इसे लगभग सही करने में सक्षम था। एकमात्र समस्या यह है कि सामग्री रिक्ति एनिमेटिंग है, मुझे परत के अंदर खींचा गया स्ट्रोक-ट्रेल भी मिलता है। – SaldaVonSchwartz

+0

contentRect के लिए प्रलेखन कहता है कि "यदि यूनिट आयतों के बाहर पिक्सल का अनुरोध किया जाता है, तो सामग्री छवि के किनारे पिक्सेल को बाहर बढ़ाया जाएगा" तो मुझे लगता है कि मुझे स्ट्रोक प्रभाव मिल रहा है – SaldaVonSchwartz

2

क्या होगा यदि आपने इसके बजाय क्लिपिंग मास्क बदल दिया है? (या एक मुखौटा परत का उपयोग करें)।

3

"पिताजी" सही जवाब है।

आप एक कैशपलेयर बनाना चाहते हैं, और इसे अपनी परत पर मुखौटा के रूप में स्थापित करना चाहते हैं।

आप एक सीजीपैथ बनाते हैं जो सिर्फ एक आयत है और उस पथ को आकार परत में स्थापित करें। पथ की सामग्री निर्धारित करती है कि मुखौटा परत के किनारे दिखाई देते हैं। यदि पथ परत के बीच में एक त्रिकोण है, तो केवल त्रिकोण दिखाई देता है।

फिर आप एक एनीमेशन बनाते हैं जो पथ को एनिमेट करता है।

नीचे से अपनी छवि को प्रकट करने के लिए, आप एक पथ स्थापित करेंगे जो परत के नीचे 0 ऊंचाई आयताकार था, और फिर आप एक सीएएनीमेशन बनायेंगे जहां toValue एक हाइट के साथ एक ही आयताकार है पूरी परत का आप प्रकट करना चाहते हैं। सिस्टम एक एनीमेशन उत्पन्न करेगा जो एक स्वीप में छवि को प्रकट करता है।

आप खलिहान दरवाजे, वेनिस अंधा, "आईरिस मिटा" आदि जैसे शांत प्रभाव के सभी प्रकार, प्राप्त करने के लिए इस उसी तकनीक का उपयोग कर सकते हैं

+0

विस्तृत विवरण के लिए धन्यवाद –

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

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