Skip to content

Instantly share code, notes, and snippets.

@mourad-brahim
Last active June 11, 2024 14:07
Show Gist options
  • Select an option

  • Save mourad-brahim/cf0bfe9bec5f33a6ea66 to your computer and use it in GitHub Desktop.

Select an option

Save mourad-brahim/cf0bfe9bec5f33a6ea66 to your computer and use it in GitHub Desktop.
Shake animation with swift
extension UIView {
func shake(duration: CFTimeInterval) {
let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
translation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
translation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0]
let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0].map {
(let degrees: Double) -> Double in
let radians: Double = (M_PI * degrees) / 180.0
return radians
}
let shakeGroup: CAAnimationGroup = CAAnimationGroup()
shakeGroup.animations = [translation, rotation]
shakeGroup.duration = duration
self.layer.addAnimation(shakeGroup, forKey: "shakeIt")
}
}
@AD-Paladins

Copy link
Copy Markdown

works like a charm (tested with textFields)

@shawnwall

Copy link
Copy Markdown

Updated for swift 4:

extension UIView {
    func shake(duration: CFTimeInterval) {
        let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
        translation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        translation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0]
        
        let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        rotation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0].map {
            ( degrees: Double) -> Double in
            let radians: Double = (.pi * degrees) / 180.0
            return radians
        }
        
        let shakeGroup: CAAnimationGroup = CAAnimationGroup()
        shakeGroup.animations = [translation, rotation]
        shakeGroup.duration = duration
        self.layer.add(shakeGroup, forKey: "shakeIt")
    }
}

@sebbo176

Copy link
Copy Markdown

Very nice!

@aayusharyan

Copy link
Copy Markdown

For folks using this for MacOS App

extension NSView {
    func shake(duration: CFTimeInterval) {
        let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
        translation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
        translation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0]

        let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        rotation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0].map {
            (degrees: Double) -> Double in
            let radians: Double = (.pi * degrees) / 180.0
            return radians
        }

        let shakeGroup: CAAnimationGroup = CAAnimationGroup()
        shakeGroup.animations = [translation, rotation]
        shakeGroup.duration = duration
        self.layer?.add(shakeGroup, forKey: "shakeIt")
    }
}

@abhishekbedi1432

Copy link
Copy Markdown

Awesome Guys!
Can we please have a completion call back as well

@Coder-ACJHP

Copy link
Copy Markdown

Thanks guys, great work 👍

@rmnblm

rmnblm commented May 2, 2019

Copy link
Copy Markdown

Updated for Swift 5.0

extension UIView {
    func shake(duration: CFTimeInterval) {
        let shakeValues = [-5, 5, -5, 5, -3, 3, -2, 2, 0]

        let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
        translation.timingFunction = CAMediaTimingFunction(name: .linear)
        translation.values = shakeValues
        
        let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        rotation.values = shakeValues.map { (.pi * $0) / 180.0 }
        
        let shakeGroup = CAAnimationGroup()
        shakeGroup.animations = [translation, rotation]
        shakeGroup.duration = 1.0
        layer.add(shakeGroup, forKey: "shakeIt")
    }
}

@mourad-brahim

mourad-brahim commented Jul 2, 2019

Copy link
Copy Markdown
Author

@shawnwall, @aayusharyan and @rmnblm, many thanks for your updates

@alfredoxyanez

Copy link
Copy Markdown

Is there sample code that show us how to use it with Images or TextFields etc ?

@ahmedsafadii

ahmedsafadii commented Oct 3, 2019

Copy link
Copy Markdown

updated for swift 5.1

extension UIView {
    func shake(duration: CFTimeInterval) {
        let shakeValues = [-5, 5, -5, 5, -3, 3, -2, 2, 0]

        let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
        translation.timingFunction = CAMediaTimingFunction(name: .linear)
        translation.values = shakeValues
        
        let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        rotation.values = shakeValues.map { (Int(Double.pi) * $0) / 180 }
        
        let shakeGroup = CAAnimationGroup()
        shakeGroup.animations = [translation, rotation]
        shakeGroup.duration = 1.0
        layer.add(shakeGroup, forKey: "shakeIt")
    }
}

@mourad-brahim

Copy link
Copy Markdown
Author

Is there sample code that show us how to use it with Images or TextFields etc ?

myTextField..shake(duration: 1.0)

@mourad-brahim

Copy link
Copy Markdown
Author

updated for swift 5.1

extension UIView {
    func shake(duration: CFTimeInterval) {
        let shakeValues = [-5, 5, -5, 5, -3, 3, -2, 2, 0]

        let translation = CAKeyframeAnimation(keyPath: "transform.translation.x");
        translation.timingFunction = CAMediaTimingFunction(name: .linear)
        translation.values = shakeValues
        
        let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
        rotation.values = shakeValues.map { (Int(Double.pi) * $0) / 180 }
        
        let shakeGroup = CAAnimationGroup()
        shakeGroup.animations = [translation, rotation]
        shakeGroup.duration = 1.0
        layer.add(shakeGroup, forKey: "shakeIt")
    }
}

Many thanks for the update. You maybe forgot to use the animation duration parameter:
shakeGroup.duration = duration
insteed of
shakeGroup.duration = 1.0

@melih110

Copy link
Copy Markdown

Hocam kolay gelsin bu windowsta calisan uiview de nasil görüntülenir acaba

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment