2015-01-10 4 views
23

निष्पादित करने से पहले स्विफ्ट एनीमेशन को पूरा करने के लिए प्रतीक्षा करें, मैं UIImageView को एनिमेट करने की कोशिश कर रहा हूं और फिर एनीमेशन पूर्ण होने के बाद छवि दृश्य को छुपा रहा हूं। हालांकि एनीमेशन पूरा होने से पहले छविदृश्य छुपाया जाता है। मैंने इसी तरह के प्रश्नों को देखा और वे एनीमेशन श्रोता को कार्यान्वित करने या एनीमेशन कोड के भीतर .hidden कोड को निष्पादित करने की सलाह देते हैं, हालांकि मुझे यकीन नहीं है कि नीचे shakeView() फ़ंक्शन के अंदर इसे कैसे प्रभावित किया जाए।कोड

एनीमेशन पूर्ण होने के बाद ही मैं शेक एनीमेशन कैसे दिखा सकता हूं और छवि दृश्य को कैसे छुपा सकता हूं?

shakeView(image1!) 
shakeView(image2) 
image1!.hidden = true 
image2.hidden = true 

एनीमेशन समारोह अपने आप में इस तरह दिखता है:

func shakeView(iv: UIImageView){ 
    var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
    shake.duration = 0.1 
    shake.repeatCount = 2 
    shake.autoreverses = true 

    var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) 
    var from_value:NSValue = NSValue(CGPoint: from_point) 

    var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) 
    var to_value:NSValue = NSValue(CGPoint: to_point) 

    shake.fromValue = from_value 
    shake.toValue = to_value 
    iv.layer.addAnimation(shake, forKey: "position") 
} 
+0

देखें https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/ में "एक एनीमेशन के अंत का पता लगाने" यूआईडी/टीपी 40004514-सीएच 3-एसडब्ल्यू – Paulw11

उत्तर

53

आप के बाद एनीमेशन पूरा करता है एक पूरा होने के ब्लॉक कॉल करने के लिए एक CATransaction उपयोग कर सकते हैं।

func shakeView(iv: UIImageView){ 

    CATransaction.begin() 
    CATransaction.setCompletionBlock({ 
     iv.hidden = true 
    }) 
    var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
    shake.duration = 0.1 
    shake.repeatCount = 21 
    shake.autoreverses = true 

    var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) 
    var from_value:NSValue = NSValue(CGPoint: from_point) 

    var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) 
    var to_value:NSValue = NSValue(CGPoint: to_point) 

    shake.fromValue = from_value 
    shake.toValue = to_value 
    iv.layer.addAnimation(shake, forKey: "position") 
    CATransaction.commit() 
} 

या आप निम्नानुसार CATransaction में दोनों एनिमेशन को समूहबद्ध भी कर सकते हैं।

func shakeView(iv: UIImageView){ 
    var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
    shake.duration = 0.1 
    shake.repeatCount = 21 
    shake.autoreverses = true 

    var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) 
    var from_value:NSValue = NSValue(CGPoint: from_point) 

    var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) 
    var to_value:NSValue = NSValue(CGPoint: to_point) 

    shake.fromValue = from_value 
    shake.toValue = to_value 
    iv.layer.addAnimation(shake, forKey: "position") 
} 

override func viewDidLoad() { 
    CATransaction.begin() 

    CATransaction.setCompletionBlock({ 
     self.image1.hidden = true 
     self.image2.hidden = true 
    }) 
    shakeView(image1) 
    shakeView(image) 
    CATransaction.commit() 
} 
+0

पहला कार्यान्वयन पूरी तरह से काम करता था। मैंने UIImageView को UIButton के साथ बदल दिया और कोड बिना किसी समस्या के काम किया। धन्यवाद! – zeeshan

13

Paulw11 के रूप में उसकी टिप्पणी में alluded, आप animationDidStop: विधि में वर्णित का उपयोग कर सकते

एनीमेशन निम्नलिखित कोड का उपयोग कर कहा जाता है दस्तावेज़ लेकिन इसके अलावा, आपको CABasicAnimation/CAAnimation ऑब्जेक्ट्स की एक कुंजी जोड़नी चाहिए जैसे कि animationDidStop: विधि जानता है कि विशेष रूप से कौन सा पूरा हो गया है।

अपने शेक विधि में

तो एनीमेशन की पहचान करने और स्वयं के लिए प्रतिनिधि निर्धारित करने के लिए एक मूल्य-कुंजी युग्म जोड़ने के लिए, उदाहरण के लिए:

func shakeView(iv: UIImageView){ 

    var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
    shake.duration = 0.1 
    shake.repeatCount = 2 
    shake.autoreverses = true 

    // Add these two lines: 
    shake.setValue("shake", forKey: "animationID") 
    shake.delegate = self 

    // ... 

फिर जब एनीमेशन है के रूप में आपको सचेत करने के animationDidStop: प्रतिनिधि विधि जोड़ें पूरा तो आप अपने कोड को क्रियान्वित करने शुरू कर सकते हैं:

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 
    // Unwrap the optional value for the key "animationID" then 
    // if it's equal to the same value as the relevant animation, 
    // execute the relevant code 
    if let animationID: AnyObject = anim.valueForKey("animationID") { 
     if animationID as NSString == "shake" { 
      // execute code 
     } 
    } 
} 
+0

जानना अच्छा है, कार्यान्वयन में जोड़ने पर विचार करेगा, धन्यवाद। – zeeshan

+1

इस सटीक उदाहरण के लिए खोज रहा था। धन्यवाद! – OpherV

+1

अपने दृश्य में CAAnimationDelegate को अनुरूप बनाना न भूलें नियंत्रक –