2012-02-14 14 views
11

मेरे पास UIImageView में लोड की गई छवियों की एक सरणी है जिसे मैं एक चक्र के माध्यम से एनिमेट कर रहा हूं। छवियों को प्रदर्शित करने के बाद, मुझे वर्तमान दृश्य नियंत्रक को खारिज करने के लिए @selector कहा जाना चाहिए। छवियों इस कोड के साथ ठीक एनिमेटेड:UIImageView एनीमेशन के बाद एक्सेस विधि

NSArray * imageArray = [[NSArray alloc] initWithObjects: 
         [UIImage imageNamed:@"HowTo1.png"], 
         [UIImage imageNamed:@"HowTo2.png"], 
         nil]; 
UIImageView * instructions = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

instructions.animationImages = imageArray; 
[imageArray release]; 
instructions.animationDuration = 16.0; 
instructions.animationRepeatCount = 1; 
instructions.contentMode = UIViewContentModeBottomLeft; 
[instructions startAnimating]; 
[self.view addSubview:instructions]; 
[instructions release]; 

16 सेकंड के बाद, मैं एक विधि के नाम से जाना चाहते हैं। मैंने UIView क्लास विधि setAnimationDidStopSelector: में देखा लेकिन मैं इसे अपने वर्तमान एनीमेशन कार्यान्वयन के साथ काम नहीं कर सकता। कोई सुझाव?

धन्यवाद।

उत्तर

22

उपयोग performSelector:withObject:afterDelay::

[self performSelector:@selector(animationDidFinish:) withObject:nil 
    afterDelay:instructions.animationDuration]; 

या dispatch_after का उपयोग करें:

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, instructions.animationDuration * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self animationDidFinish]; 
}); 
+0

मैं पहली विधि के साथ गया, धन्यवाद। –

+0

यह विधि ठीक काम करने लगती है, धन्यवाद लूट! लेकिन मैं सोच रहा था कि क्या होगा यदि किसी कारण से आईफोन की फ्रेम दर ड्रॉप बहुत है। आइए 30 से 15 तक कहें। उस मामले में एनीमेशन समाप्त नहीं होगा जब प्रेषण टाइमर रन आउट हो जाएगा? – Tieme

+0

आपको लगता है कि फ्रेम दर छोड़ने से एनीमेशन अधिक समय तक ले जाएगा? हो सकता है कि छवि दृश्य फ्रेम को छोड़ देता है अगर यह नहीं टिक सकता है। –

3

आप अपनी एनीमेशन की अवधि के बाद आग लगाने के लिए टाइमर बना सकते हैं। कॉलबैक आपके तर्क को संसाधित कर सकता है जिसे आप एनीमेशन खत्म होने के बाद निष्पादित करना चाहते हैं। अपने कॉलबैक में एनीमेशन [UIImageView isAnimating] की स्थिति की जांच करें, अगर आप एनीमेशन खत्म करने के लिए और अधिक समय चाहते हैं।

1

ImageView.m

में
- (void) startAnimatingWithCompleted:(void (^)(void))completedHandler { 
if (!self.isAnimating) { 
    [self startAnimating]; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, self.animationDuration * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(),completedHandler);  
}} 
8

UIImageView के साथ ठीक ऐसा करने के लिए कोई तरीका नहीं है। देरी का उपयोग करना ज्यादातर समय काम करेगा, लेकिन शुरुआत के बाद कुछ अंतराल हो सकता है एनीमेशन स्क्रीन पर एनीमेशन होने से पहले कहा जाता है, इसलिए यह सटीक नहीं है। इस एनीमेशन के लिए UIImageView का उपयोग करने के बजाय एक CAKeyframeAnimation का उपयोग करने का प्रयास करें जो एनीमेशन समाप्त होने पर एक प्रतिनिधि विधि को कॉल करेगा। इन पंक्तियों के साथ कुछ:

NSArray * imageArray = [[NSArray alloc] initWithObjects: 
        (id)[UIImage imageNamed:@"HowTo1.png"].CGImage, 
        (id)[UIImage imageNamed:@"HowTo2.png"].CGImage, 
        nil]; 
UIImageView * instructions = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

//create animation 
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation]; 
[anim setKeyPath:@"contents"]; 
[anim setValues:imageArray]; 

[anim setRepeatCount:1]; 
[anim setDuration:1]; 
anim.delegate = self; // delegate animationDidStop method will be called 

CALayer *myLayer = instructions.layer; 

[myLayer addAnimation:anim forKey:nil]; 

तो बस animationDidStop प्रतिनिधि विधि

+0

सरणी में CGImage नहीं जोड़ सकता है। –

+0

एक सरणी में CGImage जोड़ने के कारण चेतावनी से छुटकारा पाने के लिए बस इसे आईडी पर डालें। –

+0

उपरोक्त प्रतिबिंबित करने के लिए संपादित उत्तर। देखें [सेब डॉक] (https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CAKeyframeAnimation_class/Introduction/Introduction.html#//apple_ref/occ/instp/CAKeyframeAnimation/values)। –

4

इस प्रक्रिया में टाइमर जबकि imageView अभी भी छवि लोड धीमी गति की वजह से एनिमेट है आग से बचने के साथ लागू करते हैं। आप इस तरह से दोनों performSelector: withObject: afterDelay: और GCD इस्तेमाल कर सकते हैं:

[self performSelector:@selector(didFinishAnimatingImageView:) 
      withObject:imageView 
      afterDelay:imageView.animationDuration]; 

/\self.imageView.animationDurationstartAnimating से पहले से कॉन्फ़िगर किया गया सट्टा लगाने के है, अन्यथा यह हो जाएगा 0

से अगर -(void)didFinishAnimatingImageView: एक पृष्ठभूमि कतार बना, प्रदर्शन एक, isAnimating संपत्ति पर जांच की तुलना में मुख्य कतार पर बाकी निष्पादित

- (void)didFinishAnimatingImageView:(UIImageView*)imageView 
{ 

    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.yourcompany.yourapp.checkDidFinishAnimatingImageView", 0); 
    dispatch_async(backgroundQueue, ^{ 

     while (self.imageView.isAnimating) 
      NSLog(@"Is animating... Waiting..."); 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      /* All the rest... */ 

     }); 

    }); 

} 
+0

सरल समाधान, आकर्षण –

20

आप कर सकते हैं रों imple उपयोग इस श्रेणी UIImageView-AnimationCompletionBlock

और स्विफ्ट संस्करण के लिए: UIImageView-AnimationImagesCompletionBlock

इस वर्ग में रीडमी फ़ाइल पर एक नजर डालें ..

UIImageView + AnimationCompletion.h और UIImageView + AnimationCompletion जोड़ें।मीटर परियोजना में फ़ाइलों और उन्हें UIImageView + AnimationCompletion.h फ़ाइल आयात जहां उदाहरण के लिए इस ..

उपयोग करना चाहते हैं।

NSMutableArray *imagesArray = [[NSMutableArray alloc] init]; 
for(int i = 10001 ; i<= 10010 ; i++) 
    [imagesArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",i]]]; 

self.animatedImageView.animationImages = imagesArray; 
self.animatedImageView.animationDuration = 2.0f; 
self.animatedImageView.animationRepeatCount = 3; 
[self.animatedImageView startAnimatingWithCompletionBlock:^(BOOL success){ 
NSLog(@"Animation Completed",);}]; 
+0

जैसे काम करता है धन्यवाद! यह भी खूब रही। – daspianist

+0

यह स्वीकार्य उत्तर होना चाहिए – 2cupsOfTech

+0

मैं यह नहीं समझ सकता कि इसे तेजी से कैसे उपयोग किया जाए। ब्रिजिंग हेडर में जोड़ने के बाद भी यह काम नहीं करता है। –

0

से GurPreet_Singh उत्तर (UIImageView + AnimationCompletion) स्विफ्ट संस्करण बनाया मैं UIImageView के लिए एक एक्सटेंशन बनाने के लिए सक्षम नहीं था, लेकिन मेरा मानना ​​है कि यह काफी सरल उपयोग करने के लिए है।

class AnimatedImageView: UIImageView, CAAnimationDelegate { 

    var completion: ((_ completed: Bool) -> Void)? 

    func startAnimate(completion: ((_ completed: Bool) -> Void)?) { 
     self.completion = completion 
     if let animationImages = animationImages { 
      let cgImages = animationImages.map({ $0.cgImage as AnyObject }) 
      let animation = CAKeyframeAnimation(keyPath: "contents") 
      animation.values = cgImages 
      animation.repeatCount = Float(self.animationRepeatCount) 
      animation.duration = self.animationDuration 
      animation.delegate = self 

      self.layer.add(animation, forKey: nil) 
     } else { 
      self.completion?(false) 
     } 
    } 

    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 
     completion?(flag) 
    } 
} 


let imageView = AnimatedImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 135)) 
imageView.image = images.first 
imageView.animationImages = images 
imageView.animationDuration = 2 
imageView.animationRepeatCount = 1 
view.addSubview(imageView) 

imageView.startAnimate { (completed) in 
    print("animation is done \(completed)") 
    imageView.image = images.last 
} 
संबंधित मुद्दे