setFrame в анимации UIView не двигается, только защелкивается на месте - PullRequest
5 голосов
/ 20 июля 2011

В моем методе viewDidLoad я помещаю кнопку слева от вида, вне экрана.

Затем я использую эти два метода для его анимации:

-(void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self showButton];
}

И метод:

-(void) showButton {
    [myButton setTitle:[self getButtonTitle] forState:UIControlStateNormal];

    // 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:kMyButtonFrameCenter]; // defined CGRect
    [UIView commitAnimations];
}

Кнопка сразу появляется и не анимируется.Кроме того, селектор animationDone вызывается немедленно.

Почему он не анимирует мою кнопку на экране?

РЕДАКТИРОВАТЬ: Это связано с попыткой запустить анимацию во времяviewDidAppear ...

Ответы [ 2 ]

6 голосов
/ 20 июля 2011

Я попробовал ваш код анимации, и он отлично работает.

Где установить начальный кадр кнопки? Возможно ли, что вы по ошибке установили рамку кнопки на 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, чтобы убедиться, что кнопка находится за пределами экрана до того, как вызовет анимацию

.
3 голосов
/ 20 июля 2011

Поместите вызов анимации в viewDidAppear. viewDidLoad используется для дополнительной настройки типа данных. Любые визуальные эффекты, такие как анимация, должны идти в viewDidAppear. Вы подтвердили это - это работает, если вы немного подождете.

...