2009-03-10 22 views
139

आईफोन पर दृश्य संक्रमण एनिमेट करने के लिए सबसे अच्छा अभ्यास क्या माना जाता है?आईफोन UIView एनीमेशन बेस्ट प्रैक्टिस

उदाहरण के लिए, सेब से ViewTransitions नमूना परियोजना की तरह कोड का उपयोग करता है:

CATransition *applicationLoadViewIn = [CATransition animation]; 
[applicationLoadViewIn setDuration:1]; 
[applicationLoadViewIn setType:kCATransitionReveal]; 
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal]; 

लेकिन वहां भी शुद्ध चारों ओर चल कोड के टुकड़े है कि इस तरह लग रहे हैं:

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.75]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; 
[myview removeFromSuperview]; 
[UIView commitAnimations]; 

क्या सबसे अच्छा है दृष्टिकोण? यदि आप एक स्निपेट भी प्रदान कर सकते हैं तो इसकी बहुत सराहना की जाएगी।

नोट: मैं सही तरीके से काम करने के लिए दूसरा दृष्टिकोण प्राप्त करने में असमर्थ हूं।

उत्तर

117

UIView reference के beginAnimations:context: विधि के बारे में अनुभाग से:

इस विधि का

उपयोग 4.0 और बाद में iPhone OS में हतोत्साहित किया जाता है। आपको इसके बजाय ब्लॉक-आधारित एनीमेशन विधियों का उपयोग करना चाहिए।

ब्लॉक आधारित एनीमेशन के उदाहरण पर टॉम की टिप्पणी

[UIView transitionWithView:mysuperview 
        duration:0.75 
        options:UIViewAnimationTransitionFlipFromRight 
       animations:^{ 
        [myview removeFromSuperview]; 
       } 
       completion:nil]; 
+1

इस राफेल को अपडेट करने के लिए धन्यवाद। –

+4

तो .. स्पष्ट होने के लिए, इसका मतलब है कि पहला दृष्टिकोण (कैट्रानिशन) का उपयोग करें, दूसरा नहीं? –

+2

हां, यह पहला दृष्टिकोण है (कैट्रानिशन)। – NebulaFox

52

अंतर एनीमेशन पर आपको आवश्यक नियंत्रण की मात्रा प्रतीत होता है।

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

UIView वर्ग तरीकों आम एनिमेशन के लिए सुविधा तरीके हैं, लेकिन CATransition की तुलना में अधिक सीमित हैं refactor। उदाहरण के लिए, केवल चार संभावित संक्रमण प्रकार हैं (बाएं फ्लिप करें, दाएं फ्लिप करें, कर्ल अप करें, कर्ल डाउन करें)। यदि आप एक फीका करना चाहते हैं, तो आपको या तो CATransition's फीड संक्रमण में खोदना होगा, या अपने UIView के अल्फा की एक स्पष्ट एनीमेशन सेट अप करना होगा।

ध्यान दें कि CATransition मैक ओएस एक्स पर आप एक मनमाना CoreImage एक संक्रमण के रूप में उपयोग करने के लिए फिल्टर निर्दिष्ट करने देगा, लेकिन के रूप में यह अब खड़ा है आप iPhone, जो CoreImage का अभाव है पर ऐसा नहीं कर सकते।

+7

ध्यान दें कि यह आईओएस 2.0 युग सलाह है। यदि आप आईओएस 4.0 या ऊपर हैं तो ब्लॉक-आधारित विधियों पर राफेल वेगा का जवाब देखें। –

+0

यह भी ध्यान दें कि CoreImage अब आईओएस 5 के रूप में उपलब्ध है, लेकिन इसकी कुछ विशेषताएं हैं। मुझे विश्वास है कि आप एक एनीमेशन में कोरइमेज संक्रमण का उपयोग कर सकते हैं, लेकिन आप आईओएस (5) पर कस्टम कोरइमेज फ़िल्टर नहीं बना सकते हैं। –

69

मैं बाद में बहुत अच्छे हल्के एनिमेशन के लिए उपयोग कर रहा हूं। आप इसे दो दृश्यों में क्रॉसफ़ेड का उपयोग कर सकते हैं, या किसी के सामने एक फीका कर सकते हैं, या इसे फीका कर सकते हैं। आप बैनर की तरह किसी अन्य पर एक दृश्य शूट कर सकते हैं, आप एक दृश्य खिंचाव या सिकुड़ सकते हैं ... मुझे beginAnimation/commitAnimations से बहुत अधिक लाभ मिल रहा है।

मत सोचो तुम सब कर सकते हैं कि:

[UIView beginAnimations:nil context:NULL]; { 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationDelegate:self]; 
    if (movingViewIn) { 
// after the animation is over, call afterAnimationProceedWithGame 
// to start the game 
     [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)]; 

//  [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation 
//  [UIView setAnimationDelay:0.50]; 
//  [UIView setAnimationRepeatAutoreverses:YES]; 

     gameView.alpha = 1.0; 
     topGameView.alpha = 1.0; 
     viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height); 
     viewrect2.origin.y = -20; 

     topGameView.alpha = 1.0; 
    } 
    else { 
    // call putBackStatusBar after animation to restore the state after this animation 
     [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)]; 
     gameView.alpha = 0.0; 
     topGameView.alpha = 0.0; 
    } 
    [gameView setFrame:viewrect1]; 
    [topGameView setFrame:viewrect2]; 

} [UIView commitAnimations]; 

आप देख सकते हैं, तो आप अल्फा, फ्रेम, और यहां तक ​​कि आकारों के साथ खेल सकते हैं:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; 

यहां एक नमूना है एक दृश्य के मूर्ख या गैर जिम्मेदाराना व्यवहार। आप इसकी क्षमताओं से आश्चर्यचकित हो सकते हैं।

8

UIView डॉक्स में आधारित, के लिए इस समारोह के बारे में पढ़ा है iOS4 +

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion 
26

हम चेतन कर सकते हैं इस सरल कोड का उपयोग कर आईओएस 5 में छवियां।

CGRect imageFrame = imageView.frame; 
imageFrame.origin.y = self.view.bounds.size.height; 

[UIView animateWithDuration:0.5 
    delay:1.0 
    options: UIViewAnimationCurveEaseOut 
    animations:^{ 
     imageView.frame = imageFrame; 
    } 
    completion:^(BOOL finished){ 
     NSLog(@"Done!"); 
    }]; 
+5

यह आईओएस 4 में भी उपलब्ध है और इसे "ब्लॉक आधारित" एनीमेशन के रूप में जाना जाता है। यह आईओएस 5 और बाद में प्रतिबंधित नहीं है। – johnbakers

6

वैसे भी "ब्लॉक" विधि अब-प्रतिदिन प्रीफ़र्ड किया गया है। मैं नीचे दिए गए सरल ब्लॉक को समझाऊंगा।

नीचे कतरना पर विचार करें। बग 2 और बग 3 छवि दृश्य हैं। नीचे दी गई एनीमेशन 1 सेकंड की देरी के बाद 1 सेकंड की अवधि के साथ एनीमेशन का वर्णन करती है। बग 3 को इसके केंद्र से बग 2 के केंद्र में ले जाया गया है। एक बार एनीमेशन पूरा हो जाने पर यह "सेंटर एनीमेशन हो गया!" लॉग हो जाएगा।

-(void)centerAnimation:(id)sender 
{ 
NSLog(@"Center animation triggered!"); 
CGPoint bug2Center = bug2.center; 

[UIView animateWithDuration:1 
         delay:1.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        bug3.center = bug2Center; 
       } 
       completion:^(BOOL finished){ 
        NSLog(@"Center Animation Done!"); 
       }]; 
} 

आशा साफ है कि !!!

+1

आप bug3Center को bug3.center CGPoint सौंपा और सिर्फ इतना है कि तुम्हारे जाने के बाद एक ही चर bug3Center को bug2.center CGPoint आवंटित? तुम वो क्यों कर रहे हो ? – pnizzle

+0

आपको लगता है कि आपको अपना कोड जांचना होगा :-) – SomaMan

+0

ओह !! एक टाइपो दोस्त है। अभी अपडेट किया गया – Deepukjayan

4

मैं इस लिंक में एक अच्छा ट्यूटोरियल पाया। उम्मीद है कि यह किसी के लिए सहायक होगा।

uiview-animation-tutorial

2

यहाँ संहिता चिकना एनीमेशन के लिए, कई डेवलपर्स के लिए उपयोगी हो सकता है।
I found this snippet of code from this tutorial.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[animation setAutoreverses:YES]; 
[animation setFromValue:[NSNumber numberWithFloat:1.3f]]; 
[animation setToValue:[NSNumber numberWithFloat:1.f]]; 
[animation setDuration:2.f]; 
[animation setRemovedOnCompletion:NO]; 

[animation setFillMode:kCAFillModeForwards]; 
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation. 
1

की कोशिश करते हैं और स्विफ्ट 3 के लिए चेकआउट करते हैं ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: { 
    myview.removeFromSuperview() 
}, completion: nil) 
संबंधित मुद्दे