Shake Animation for UITextField/UIView in Swift

后端 未结 10 1374
梦毁少年i
梦毁少年i 2020-12-07 09:37

I am trying to figure out how to make the text Field shake on button press when the user leaves the text field blank.

I currently have the following code working:

相关标签:
10条回答
  • 2020-12-07 10:22

    Swift 5

    Safe (non crash) shake extension for Corey Pett answer:

    extension UIView {
        func shake(for duration: TimeInterval = 0.5, withTranslation translation: CGFloat = 10) {
            let propertyAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.3) {
                self.transform = CGAffineTransform(translationX: translation, y: 0)
            }
    
            propertyAnimator.addAnimations({
                self.transform = CGAffineTransform(translationX: 0, y: 0)
            }, delayFactor: 0.2)
    
            propertyAnimator.startAnimation()
        }
    }
    
    0 讨论(0)
  • 2020-12-07 10:22
    func shakeTextField(textField: UITextField)
    {
        let animation = CABasicAnimation(keyPath: "position")
        animation.duration = 0.07
        animation.repeatCount = 3
        animation.autoreverses = true
        animation.fromValue = NSValue(cgPoint: CGPoint(x: textField.center.x - 10, y: textField.center.y))
        animation.toValue = NSValue(cgPoint: CGPoint(x: textField.center.x + 10, y: textField.center.y))
        textField.layer.add(animation, forKey: "position")
    
        textField.attributedPlaceholder = NSAttributedString(string: textField.placeholder ?? "",
                                                             attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])
    
    }
    

    //write in base class or any view controller and use it

    0 讨论(0)
  • 2020-12-07 10:25

    The following function is used in any view.

    extension UIView {
        func shake() {
            let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
            animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
            animation.duration = 0.6
            animation.values = [-20.0, 20.0, -20.0, 20.0, -10.0, 10.0, -5.0, 5.0, 0.0 ]
            layer.add(animation, forKey: "shake")
        }
    }
    
    0 讨论(0)
  • 2020-12-07 10:25
    extension CALayer {
    
        func shake(duration: NSTimeInterval = NSTimeInterval(0.5)) {
    
            let animationKey = "shake"
            removeAnimationForKey(animationKey)
    
            let kAnimation = CAKeyframeAnimation(keyPath: "transform.translation.x")
            kAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
            kAnimation.duration = duration
    
            var needOffset = CGRectGetWidth(frame) * 0.15,
            values = [CGFloat]()
    
            let minOffset = needOffset * 0.1
    
            repeat {
    
                values.append(-needOffset)
                values.append(needOffset)
                needOffset *= 0.5
            } while needOffset > minOffset
    
            values.append(0)
            kAnimation.values = values
            addAnimation(kAnimation, forKey: animationKey)
        }
    }
    

    How to use:

    [UIView, UILabel, UITextField, UIButton & etc].layer.shake(NSTimeInterval(0.7))
    
    0 讨论(0)
提交回复
热议问题