2012-09-24 23 views
7

मैं निम्नलिखित हासिल करने की कोशिश कर रहा हूँ। दृश्य को स्पर्श के बिंदु से अंतिम फ्रेम तक शुरू करने में एनिमेट करना चाहिए जो स्पर्श किए गए दृश्य के बाहर और बाईं ओर है। एनीमेशन के दौरान यह एक चक्र होना चाहिए, सही स्थिति और आकार में बढ़ रहीएनिमेशन, CALayer

सभी नीचे दिए गए कोड के साथ अच्छी तरह से काम करता है, केवल कि एनीमेशन दौरान, परिपत्र सीमा केवल बाईं तरफ है। यह CALayer आकार की तरह है अपने अंतिम फ्रेम में स्लाइडिंग है।

ऐसा लगता है कि यह इस प्रकार है।

enter image description here

एक बार एनीमेशन पूरा करता है, मैं चक्र पूरा होने की उम्मीद के रूप में की है।

CGFloat w = 300; 
CGRect frame = CGRectMake(myX, myY, w, w); 
CGPoint p = [touch locationInView:self.imageView]; 
CGRect initialFrame = CGRectMake(p.x, p.y, 0,0); 
UIImageView *circle = [[UIImageView alloc] initWithFrame:frame]; 
circle.image = [UIImage imageNamed:@"china"]; 
circle.contentMode = UIViewContentModeScaleAspectFill; 
circle.backgroundColor = [UIColor clearColor]; 
circle.layer.borderWidth = 1; 
circle.layer.borderColor = [UIColor grayColor].CGColor; 
circle.layer.masksToBounds = YES; 

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
CGRect maskRect = CGRectMake(0, 0, w, w); 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddEllipseInRect(path, nil, maskRect); 
maskLayer.path = path; 
CGPathRelease(path); 
circle.layer.mask = maskLayer; 

circle.frame = initialFrame; 
[self.imageView addSubview:circle]; 
[UIView animateWithDuration:1.0 animations:^{ 
    circle.frame = frame; 
}]; 

मैं सिर्फ CALayer की cornerRadius के साथ काम करने की कोशिश की है, लेकिन वह संतोषजनक परिणाम के लिए या तो नेतृत्व नहीं करता है, के रूप में त्रिज्या के रूप में अच्छी तरह से फ्रेम आकार के साथ बदलने के लिए होगा।

उत्तर

18

आप फ्रेम को एनिमेट कर रहे हैं लेकिन मुखौटा नहीं। गोलाकार मुखौटा आकार में स्थिर रहता है और आपकी छवि फ्रेम शीर्ष बाएं से पूर्ण आकार तक एनिमेटेड होती है। यही कारण है कि आप छवि के ऊपरी बाएं हिस्से के गोलाकार क्लिपिंग प्राप्त करते हैं, जब तक कि यह अंतिम फ्रेम आकार तक न हो जाए।

यह वही है मूल रूप से अपने एनीमेशन में होता है: enter image description here

आप एक को बदलने (जो समापन समारोह काटा छवि वास्तव में बदल सकते हैं के रूप में आप इसे देखना चाहते हैं) फ्रेम एनिमेट के बजाय चेतन करने की कोशिश कर सकते हैं।

कुछ की तरह:

// Don't animate the frame. Give it the finale value before animation. 
circle.frame = frame; 

// Animate a transform instead. For example, a scaling transform. 
circle.transform = CGAffineTransformMakeScale(0, 0); 
[UIView animateWithDuration:1.0 animations:^{ 
    circle.transform = CGAffineTransformMakeScale(1, 1); 
}]; 
+1

शानदार! विशेष रूप से आपके दस्तावेज़ीकरण प्रयास के लिए धन्यवाद। यह एक महान और क्रियाशील स्पष्टीकरण है। मैं इरादे के रूप में अब काम करता है। – Mundi

0

क्या आपने सर्कल व्यू के ऑटोरेसाइजिंग मास्क के साथ खेलने का प्रयास किया था, जिससे इसे लचीला बाएं/दाएं मार्जिन मिल सकते थे?

यह एनीमेशन में एक भूमिका निभा सकता है और समझा सकता है कि आपका दृश्य "स्लाइड" क्यों दिखाई देता है। (कम से कम यह एक कोशिश के लायक है)

+0

इस विचारशील सुझाव के लिए धन्यवाद। दुर्भाग्यवश, इसने वर्णित व्यवहार को नहीं बदला। – Mundi