का उपयोग करके दृश्य के दो राज्यों के बीच एनिमेट करें, मैं एक दृश्य के दो राज्यों के बीच एनिमेट करना चाहता हूं। कहें, उदाहरण के लिए, मेरे पास एक लेबल के साथ एक दृश्य है और जब मैं लेबल के पाठ को बदलता हूं तो एक एनीमेशन प्रस्तुत करता है जो पृष्ठ फ़्लिपिंग के रूप में बदल जाता है।कस्टम एनीमेशन
अब आप निश्चित रूप से एक [UIView setAnimationTransition:forView:cache:]
के साथ ऐसा कर सकते हैं:
- (IBAction)nextPage {
[UIView beginAnimation:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:pageView cache:NO];
label.text = @"page 2";
[UIView commitAnimations];
}
- (IBAction)previousPage {
[UIView beginAnimation:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:pageView cache:NO];
label.text = @"page 1";
[UIView commitAnimations];
}
... लेकिन फिर आप अपने स्वयं के कस्टम एनिमेशन का उपयोग नहीं कर सकते हैं, आप में निर्मित एनिमेशन के लिए फंस रहे हैं (वे अच्छे हैं, लेकिन वे मेरी जरूरतों के अनुरूप नहीं हैं)।
तो दूसरा विकल्प दृश्य की परत करने के लिए एक CAAnimation
जोड़ने के लिए है:
- (IBAction)nextPage {
CAAnimation *animation = [self animationWithDuration:1 forward:NO];
[pageView.layer addAnimation:animation forKey:@"pageTransition"];
label.text = @"page 2";
}
- (IBAction)previousPage {
CAAnimation *animation = [self animationWithDuration:1 forward:YES];
[pageView.layer addAnimation:animation forKey:@"pageTransition"];
label.text = @"page 1";
}
तो फिर तुम स्थापित करने के लिए जो कुछ भी एनीमेशन कोर एनिमेशन तुम क्या करने में सक्षम बनाता है के लिए स्वतंत्र हैं। यह अच्छी तरह से काम करता है अगर मैं CATransition
एनीमेशन परिभाषित करता हूं, उदाहरण के लिए kCATransitionReveal
: "पृष्ठ 2" स्थिति में दृश्य "पेज 1" स्थिति में दृश्य के नीचे दिखाई देता है क्योंकि यह बाहर निकलता है।
- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionReveal];
[animation setSubtype:forward?kCATransitionFromLeft:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
animation.duration = duration;
return animation;
}
लेकिन जब मैं एनीमेशन को परिभाषित उदाहरण एक CABasicAnimation
के लिए होने के लिए, देखने के केवल एक राज्य दिख रहा है।
- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0/-1000;
transform = CATransform3DRotate(transform, M_PI, 0.0f, 1.0f, 0.0f);
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
if(forward) {
animation.fromValue = [NSValue valueWithCATransform3D:transform];
} else {
animation.toValue = [NSValue valueWithCATransform3D:transform];
}
animation.duration = duration;
return animation;
}
इसके बजाय, मैं "पेज 1" राज्य में देखने की तरह है, एनीमेशन के अंत तक दिखाई रहने के लिए है, जबकि "पृष्ठ 2" राज्य में दृश्य फ्रेम में आता है बिल्कुल के रूप में यह एक साथ बर्ताव करता है संक्रमण एनीमेशन।
बेशक, मैं हमेशा दृश्य को डुप्लिकेट करने के साथ गड़बड़ कर सकता हूं और एक को एक शीर्ष दृश्य के रूप में प्रकट कर सकता हूं जबकि मैं सबसे आगे एनिमेट करता हूं और इसे पूरा होने पर पर्यवेक्षण से हटा देता हूं ... लेकिन हासिल करने के लिए एक और अधिक सीधा तरीका होना चाहिए विचारों के साथ गड़बड़ किए बिना यह आसान एनीमेशन प्रभाव।
शायद कुछ परत बताने के लिए है, लेकिन फिर मैं क्या पता नहीं है, और कहा कि जहां मैं आपकी मदद की जरूरत है, लोग :)
धन्यवाद!