Семантическое управление версиями имеет ряд рекомендаций и правил относительно того, как применять это (и когда). Очень просто следовать, и это просто работает.
Вот руководство, в котором подробно описано, как это сделать в Какао. Должно быть то же самое для iPhone (или, по крайней мере, очень похоже).
http://www.cimgf.com/2008/02/27/core-animation-tutorial-window-shake-effect/
Простое изменение координаты X свойства center вашего представления может помочь. Если вы еще не делали базовую анимацию, прежде чем она будет довольно простой.
Сначала начните анимацию справа, затем дождитесь ее завершения, а затем вернитесь влево и так далее. Уменьшение времени, чтобы оно "казалось правильным", может занять некоторое время.
- (void)animationFinishCallback:(NSString *)animationID finished:(BOOL)finished context:(void *)context
{
if ([animationID isEqualToString:@"MoveRight"]) {
[UIView beginAnimations:@"MoveLeft" context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDelay: UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationFinishCallback:finished:context:)];
myView.center = CGRectMake(newX, newY);
[UIView commitAnimations];
}
}
Я видел некоторую анимацию качания и изменил ее, чтобы встряхнуть изображение t пикселей вверх и вниз влево:
- (void)earthquake:(UIView*)itemView
{
CGFloat t = 2.0;
CGAffineTransform leftQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, t, -t);
CGAffineTransform rightQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, t);
itemView.transform = leftQuake; // starting point
[UIView beginAnimations:@"earthquake" context:itemView];
[UIView setAnimationRepeatAutoreverses:YES]; // important
[UIView setAnimationRepeatCount:5];
[UIView setAnimationDuration:0.07];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(earthquakeEnded:finished:context:)];
itemView.transform = rightQuake; // end here & auto-reverse
[UIView commitAnimations];
}
- (void)earthquakeEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
if ([finished boolValue])
{
UIView* item = (UIView *)context;
item.transform = CGAffineTransformIdentity;
}
}