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")
}
}
@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
Copy link
Copy Markdown

rmnblm commented May 2, 2019

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
Copy link
Copy Markdown
Author

mourad-brahim commented Jul 2, 2019

@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
Copy link
Copy Markdown

ahmedsafadii commented Oct 3, 2019

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