我是写了个扩展类,方便用到的view可以很便捷的使用,以下是所有代码,可以直接引入工程使用
OC版
/**
扩展UIView增加抖动方法
@param direction:抖动方向(默认是水平方向)
@param times:抖动次数(默认5次)
@param interval:每次抖动时间(默认0.1秒)
@param delta:抖动偏移量(默认2)
@param completion:抖动动画结束后的回调
*/
-(void)shakeDirection:(ShakeDirection)direction times:(int)times interval:(NSTimeInterval)interval delta:(CGFloat) delta finished:(finished)finished{
if (times == 0) {
self.transform = CGAffineTransformIdentity;
}else{
[UIView animateWithDuration:interval animations:^{
switch (direction) {
case horizontal:
{
self.transform = CGAffineTransformMakeTranslation(delta, 0);
}
break;
case vetrtical:{
self.transform = CGAffineTransformMakeTranslation(0,delta);
}
break;
default:
break;
}
} completion:^(BOOL finish) {
[self shakeDirection:horizontal times:times-1 interval:interval delta:delta * -1 finished:finished];
}];
}
}
swift版本
extension UIView{
public func shake(direction:ShakeDirection = .horizontal,times: Int = 5,
interval:TimeInterval = 0.1, delta : CGFloat = 2,completion:(() -> Void)?=nil){
if times == 0 {
self.layer.setAffineTransform(CGAffineTransform.identity)
}else{
UIView.animate(withDuration: interval) {
switch direction {
case .horizontal:
self.layer.setAffineTransform(CGAffineTransform(translationX: delta, y: 0))
break
case .vertical:
self.layer.setAffineTransform(CGAffineTransform(translationX: 0, y: delta))
break
}
} completion: { (finished) in
self.shake(direction: direction, times: times - 1 , interval: interval, delta: delta * -1, completion: completion)
}
}
}
}