Я бы порекомендовал использовать Core Animation.Попробуйте что-то вроде этого:
-(void) flash{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
if( emergency ){
// Start flashing
[UIView setAnimationRepeatCount:1000];
[UIView setAnimationRepeatAutoreverses:YES];
[btn setAlpha:0.0f];
}else{
// Stop flashing
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationRepeatCount:1];
[btn setAlpha:1.0f];
}
emergency = !emergency;
[UIView commitAnimations];
}
Где btn объявлен как
@property(nonatomic, retain) IBOutlet UIButton *btn;
, а чрезвычайная ситуация - простая переменная BOOL.
Вызовите flash, чтобы запустить и остановитьanimation.
В этом примере мы анимируем альфа-атрибут для простоты, но вы можете сделать то же самое с задним цветом кнопки, как сказал Сэм в своем ответе, или любым другим атрибутом, который вам нравится.
Надеждаэто помогает.
ОБНОВЛЕНИЕ:
Что касается перехода между двумя изображениями, попробуйте позвонить imageFlash
вместо flash
:
-(void) imageFlash{
CABasicAnimation *imageAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
[btn setImage:normalState forState:UIControlStateNormal];
if( emergency ){
imageAnimation.duration = 0.5f;
imageAnimation.repeatCount = 1000;
}else{
imageAnimation.repeatCount = 1;
}
imageAnimation.fromValue = (id)normalState.CGImage;
imageAnimation.toValue = (id)emergencyState.CGImage;
[btn.imageView.layer addAnimation:imageAnimation forKey:@"animateContents"];
[btn setImage:normalState forState:UIControlStateNormal]; // Depending on what image you want after the animation.
emergency = !emergency;
}
Где normalState
и emergencyState
- изображения, которые вы хотите использовать:
Объявлено как:
UIImage *normalState;
UIImage *emergencyState;
Назначение изображений:
normalState = [UIImage imageNamed:@"normal.png"];
emergencyState = [UIImage imageNamed:@"alert.png"];
Удачи!