2015-01-10 4 views
23

UIImageView에 애니메이션을 적용한 다음 애니메이션이 완료된 후에 이미지보기를 숨기려고합니다. 그러나 이미지 뷰는 애니메이션이 완료되기 전에 숨겨집니다. 비슷한 질문을하고 애니메이션 리스너를 구현하거나 완료시 애니메이션 코드 내에서 .hidden 코드를 실행하는 것이 좋지만 아래 shakeView() 함수에서 어떻게 영향을 주는지 확신 할 수 없습니다.코드 실행 전에 Swift 애니메이션이 완료 될 때까지 기다리십시오.

애니메이션이 완료된 후에 만 ​​흔들기 애니메이션을 표시하고 이미지보기를 숨기려면 어떻게해야합니까?

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

애니메이션 기능 자체는 다음과 같습니다 :

Paulw11 그의 주석에서 언급으로
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/에서 "애니메이션의 종료를 검출" uid/TP40004514-CH3-SW1 – 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

, 당신이 언급 한 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

viewController에서 CAAnimationDelegate를 준수하는 것을 잊지 마십시오. –

관련 문제