2017-10-04 1 views
0

저는 키 프레임과 봄 애니메이션을 사용하여 UIView 애니메이션을 배우고 있으며이를 탭한 후 버튼을 흔들기 위해 노력하고 있습니다. 문제는 내가 라이브러리에서 버튼을 드래그 앤 드롭하여 UILabel에 후행 가장자리를 고정시킨 것입니다. 다양한 예제에서 헤더 제약이 있지만 내 버튼에는 헤더가 없습니다. 이것은 내가 지금까지 가지고있는 코드이다.탭에서 UIButton을 흔들려면 어떻게해야하나요?

@IBAction func noButtonPressed(_ sender: UIButton) { 
    UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 0.5, initialSpringVelocity: 15, options: [], animations: { 
     self.noButtonTrailing.constant = 16 
     self.view.layoutIfNeeded() 
    }) 
} 

어딘가에 헤더 제약을 가하는 것이 맞습니까? 감사합니다

답변

1

여기 선형 운동을위한 간단한 미디어 타이밍 애니메이션입니다 & UIView 댐핑 애니메이션.

enter image description here

참고 : 스위프트 4

extension UIView { 


    // Using CAMediaTimingFunction 
    func shake(duration: TimeInterval = 0.5, values: [CGFloat]) { 
     let animation = CAKeyframeAnimation(keyPath: "transform.translation.x") 
     animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
     animation.duration = duration // You can set fix duration 
     animation.values = values // You can set fix values here also 
     self.layer.add(animation, forKey: "shake") 
    } 


    // Using SpringWithDamping 
    func shake(duration: TimeInterval = 0.5, xValue: CGFloat = 12, yValue: CGFloat = 0) { 
     self.transform = CGAffineTransform(translationX: xValue, y: yValue) 
     UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 1.0, options: .curveEaseInOut, animations: { 
      self.transform = CGAffineTransform.identity 
     }, completion: nil) 

    } 


    // Using CABasicAnimation 
    func shake(duration: TimeInterval = 0.05, shakeCount: Float = 6, xValue: CGFloat = 12, yValue: CGFloat = 0){ 
     let animation = CABasicAnimation(keyPath: "position") 
     animation.duration = duration 
     animation.repeatCount = shakeCount 
     animation.autoreverses = true 
     animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x - xValue, y: self.center.y - yValue)) 
     animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x + xValue, y: self.center.y - yValue)) 
     self.layer.add(animation, forKey: "shake") 
    } 

} 

버튼 동작

@IBAction func noButtonPressed(button: UIButton) { 

    //button.shake() // for spring damping animation 

    button.shake(duration: 0.5, values: [-12.0, 12.0, -12.0, 12.0, -6.0, 6.0, -3.0, 3.0, 0.0]) 

//button.shake(shakeCount: 10) // for CABasicAnimation 

} 
+1

당신이 너무 GIF를 추가 할 수 있다면 정말 좋지 않을까 :) – Siyavash

0

난 당신이 찾고있는 생각 :

let animation = CABasicAnimation(keyPath: "position") 
animation.duration = 0.07 
animation.repeatCount = 4 
animation.autoreverses = true 
animation.fromValue = NSValue(cgPoint: CGPoint(x: self.BUTTON.center.x - 10, y: BUTTON.center.y)) 
animation.toValue = NSValue(cgPoint: CGPoint(x: BUTTON.center.x + 10, y: BUTTON.center.y)) 
BUTTON.layer.add(animation, forKey: "position") 
0

@Krunal 코드의 출력은 다음과 같습니다. 나는 3 가지 케이스를 사용하고 출력 :

Tests

@IBAction func instagramButtonClicked(_ sender: Any) { 
     guard let button = sender as? UIButton else { 
      return 
     } 

     button.shake(duration: 0.5, values: [-12.0, 12.0, -12.0, 12.0, -6.0, 6.0, -3.0, 3.0, 0.0]) 

    } 

    @IBAction func facebookButtonClicked(_ sender: Any) { 
     guard let button = sender as? UIButton else { 
      return 
     } 

     button.shake() 
    } 
    @IBAction func websiteButtonClicked(_ sender: Any) { 
     guard let button = sender as? UIButton else { 
      return 
     } 

     button.shake(duration: 0.5, values: [-1.0, 1.0, -6.0, 6.0, -10.0, 10.0, -12.0, 12.0]) 

    } 
+0

니스 .. 모든 잘 :) 작업하는 꽤 좋은 – Krunal

관련 문제