Here is @SajjadZare's answer in Swift:
Swift 2.0:
let numberOfShakes:Int = 8 let durationOfShake:Float = 0.5 let vigourOfShake:Float = 0.05 let frame:CGRect = (self.view.window?.frame)! let shakeAnimation = CAKeyframeAnimation() let shakePath = CGPathCreateMutable() CGPathMoveToPoint(shakePath, nil, NSMinX(frame), NSMinY(frame)) for _ in 1...numberOfShakes { CGPathAddLineToPoint(shakePath, nil, NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), NSMinY(frame)) CGPathAddLineToPoint(shakePath, nil, NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), NSMinY(frame)) } CGPathCloseSubpath(shakePath) shakeAnimation.path = shakePath shakeAnimation.duration = CFTimeInterval(durationOfShake) self.view.window?.animations = ["frameOrigin":shakeAnimation] self.view.window?.animator().setFrameOrigin(self.view.window!.frame.origin)
Swift 3.0:
let numberOfShakes:Int = 8 let durationOfShake:Float = 0.5 let vigourOfShake:Float = 0.05 let frame:CGRect = (self.view.window!.frame) let shakeAnimation = CAKeyframeAnimation() let shakePath = CGMutablePath() shakePath.move(to: CGPoint(x: NSMinX(frame), y: NSMinY(frame))) for _ in 1...numberOfShakes { shakePath.addLine(to: CGPoint(x:NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) shakePath.addLine(to: CGPoint(x:NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) } shakePath.closeSubpath() shakeAnimation.path = shakePath shakeAnimation.duration = CFTimeInterval(durationOfShake) self.view.window?.animations = ["frameOrigin":shakeAnimation] self.view.window?.animator().setFrameOrigin((self.view.window?.frame.origin)!)
iwatakeshi
source share