Вам, вероятно, нужно будет перейти к слою Core Animation. Свойство shadow слоя UIButton является анимируемым, поэтому вы можете создать повторяющуюся CABasicAnimation. Я меняю цвет / размер тени и добавляю его в слой. Следующий код работал для меня.
button.layer.shadowPath = [[UIBezierPath bezierPathWithRect:CGRectInset(button.bounds, -3, -3)] CGPath];
button.layer.shadowColor = [[UIColor whiteColor] CGColor];
button.layer.shadowOpacity = 1.0f;
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowColor"];
animation.fromValue = (id)[[UIColor darkGrayColor] CGColor];
animation.toValue = (id)[[UIColor lightGrayColor] CGColor];
animation.duration = 1.0f;
animation.autoreverses = YES;
animation.repeatCount = NSIntegerMax;
[button.layer addAnimation:animation forKey:@"shadow"];
И прикрепить эти методы в соответствии с событиями управления кнопки.
-(IBAction)userDidTouchDown:(UIButton *)sender
{
[button.layer removeAnimationForKey:@"shadow"];
}
-(IBAction)userDidTouchUp:(UIButton *)sender
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowColor"];
animation.fromValue = (id)[[UIColor darkGrayColor] CGColor];
animation.toValue = (id)[[UIColor lightGrayColor] CGColor];
animation.duration = 1.0f;
animation.autoreverses = YES;
animation.repeatCount = NSIntegerMax;
[button.layer addAnimation:animation forKey:@"shadow"];
}
Вы можете поэкспериментировать со значениями теней (в частности, с траекторией), чтобы подобрать их правильно. Не забудьте присоединить userDidTouchUp: как с внутренней стороны, так и с внешней стороны.