好吧固以,我不是很喜歡說廢話的人曙咽,下面就直接看代碼尤蛮,代碼都有詳細(xì)的注釋
/**
* 賬戶名為空或者密碼為空時(shí)的抖動(dòng)動(dòng)畫
*
* @param textField 用戶名輸入框/密碼輸入框
*/
- (void)shakeActionWithTextField:(UITextField *)textField
{
// 晃動(dòng)次數(shù)
static int numberOfShakes = 4;
// 晃動(dòng)幅度(相對(duì)于總寬度)
static float vigourOfShake = 0.01f;
// 晃動(dòng)延續(xù)時(shí)常(秒)
static float durationOfShake = 0.5f;
//抖動(dòng)動(dòng)畫
CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGRect frame = textField.frame;
// 創(chuàng)建路徑
CGMutablePathRef shakePath = CGPathCreateMutable();
// 起始點(diǎn)
CGPathMoveToPoint(shakePath, NULL, CGRectGetMidX(frame), CGRectGetMidY(frame));
for (int index = 0; index < numberOfShakes; index++)
{
// 添加晃動(dòng)路徑 幅度由大變小
CGPathAddLineToPoint(shakePath, NULL, CGRectGetMidX(frame) - frame.size.width * vigourOfShake*(1-(float)index/numberOfShakes),CGRectGetMidY(frame));
CGPathAddLineToPoint(shakePath, NULL, CGRectGetMidX(frame) + frame.size.width * vigourOfShake*(1-(float)index/numberOfShakes),CGRectGetMidY(frame));
}
// 閉合
CGPathCloseSubpath(shakePath);
shakeAnimation.path = shakePath;
shakeAnimation.duration = durationOfShake;
// 釋放
CFRelease(shakePath);
//添加動(dòng)畫到輸入框layer上--- bingo---
[textField.layer addAnimation:shakeAnimation forKey:kCATransition];
}
demo看這里吧:
https://github.com/wxh794708907/YJYYShakeAnimation/tree/master