Я попробовал ваш код анимации, и он отлично работает.
Где установить начальный кадр кнопки? Возможно ли, что вы по ошибке установили рамку кнопки на kMyButtonFrameCenter
перед тем, как запустить анимацию? Это объясняет, почему селектор animationDone вызывается немедленно.
Вот код, который работает:
-(void) showButton {
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton setTitle:@"test" forState:UIControlStateNormal];
myButton.frame = CGRectMake(-100.0, 100.0, 100.0, 30.0);
[self.view addSubview:myButton];
// animate in
[UIView beginAnimations:@"button_in" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDone)];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationBeginsFromCurrentState:YES];
[myButton setFrame:CGRectMake(100.0, 100.0, 100.0, 30.0)];
[UIView commitAnimations];
}
Как видите, я ничего не изменил в вашем коде анимации. Поэтому я думаю, что проблема в рамке кнопки.
Немного не по теме: если у вас нет сборки приложения для iOS <4, возможно, вы захотите взглянуть на «анимацию с блоками» в UIView, поставляемую с iOS 4.0. </p>
[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^void{myButton.frame = kMyButtonFrameCenter} completion:^(BOOL completed){NSLog(@"completed");}];
=== РЕДАКТИРОВАТЬ ===
После прочтения вашего комментария кажется, что мои подозрения не верны. inspire48 указывает в правильном направлении своим ответом. Вы должны поместить расположение кнопки внутри метода viewDidAppear
или в методе showButton
, чтобы убедиться, что кнопка находится за пределами экрана до того, как вызовет анимацию
.