2010-07-01 30 views
6

का उपयोग करके दृश्य के दो राज्यों के बीच एनिमेट करें, मैं एक दृश्य के दो राज्यों के बीच एनिमेट करना चाहता हूं। कहें, उदाहरण के लिए, मेरे पास एक लेबल के साथ एक दृश्य है और जब मैं लेबल के पाठ को बदलता हूं तो एक एनीमेशन प्रस्तुत करता है जो पृष्ठ फ़्लिपिंग के रूप में बदल जाता है।कस्टम एनीमेशन

अब आप निश्चित रूप से एक [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" राज्य में दृश्य फ्रेम में आता है बिल्कुल के रूप में यह एक साथ बर्ताव करता है संक्रमण एनीमेशन।

बेशक, मैं हमेशा दृश्य को डुप्लिकेट करने के साथ गड़बड़ कर सकता हूं और एक को एक शीर्ष दृश्य के रूप में प्रकट कर सकता हूं जबकि मैं सबसे आगे एनिमेट करता हूं और इसे पूरा होने पर पर्यवेक्षण से हटा देता हूं ... लेकिन हासिल करने के लिए एक और अधिक सीधा तरीका होना चाहिए विचारों के साथ गड़बड़ किए बिना यह आसान एनीमेशन प्रभाव।

शायद कुछ परत बताने के लिए है, लेकिन फिर मैं क्या पता नहीं है, और कहा कि जहां मैं आपकी मदद की जरूरत है, लोग :)

धन्यवाद!

उत्तर

0

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

मुझे लगता है कि यह पूरे दृश्य को बढ़ाने से बेहतर काम करेगा।

1

मैंने हाल ही में नियंत्रक में सबव्यू के बीच एक कस्टम स्लाइड संक्रमण किया है। मेरा दृष्टिकोण व्यू-आउट और व्यू-इन के बिटमैप को पकड़ना था, उन्हें एक दृश्य में जोड़ें और देखें कि इसे देखें। अंत में आप संक्रमण दृश्य को हटा सकते हैं और दृश्य-इन दिखा सकते हैं।

-(void) transitionToView:(UIView *)viewIn lastView:(UIView *)viewOut slideRight:(BOOL)isRight { 
UIGraphicsBeginImageContext(viewOut.frame.size); 

UIImageView *bitmapOut = [[UIImageView alloc] initWithFrame: viewOut.frame]; 

[viewOut.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewOutImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
bitmapOut.image = viewOutImage; 

UIImageView *bitmapIn = [[UIImageView alloc] initWithFrame: viewIn.frame ]; 
bitmapIn.frame = CGRectMake(isRight ? 320 : -320, bitmapIn.frame.origin.y, bitmapIn.frame.size.width, bitmapIn.frame.size.height); 
UIGraphicsBeginImageContext(viewIn.frame.size); 

[viewIn.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewInImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

bitmapIn.image = viewInImage; 

[self.view addSubview:transitionContainer]; 

[transitionContainer addSubview:bitmapIn]; 
[transitionContainer addSubview:bitmapOut]; 

[self removeAllViews]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.5f]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(swapViewsAtEndOfTransition:)]; 
transitionContainer.frame = CGRectMake(isRight ? -320 : 320, 0, 640, 411); 
[UIView commitAnimations]; 

[bitmapOut release]; bitmapOut = nil; 
[bitmapIn release]; bitmapIn = nil;} 

फिर, swapViewsAtEndOfTransition चयनकर्ता में आप विचारों तदनुसार अपडेट कर सकते हैं: यहाँ एक टुकड़ा संक्रमण विधि है।

0

साल बीत चुके हैं लेकिन मुझे लगता है कि मुझे आपके लिए समाधान मिला है। kCATransitionReveal के बजाय बस kCATransitionPush का उपयोग करें। इस तरह:

- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward { 
    CATransition *animation = [CATransition animation]; 
    [animation setType:kCATransitionPush]; 
    [animation setSubtype:forward?kCATransitionFromLeft:kCATransitionFromRight]; 
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 

    animation.duration = duration; 
    return animation; 
} 
संबंधित मुद्दे