Мой блок Core Animation не работает так, как я ожидал - PullRequest
1 голос
/ 29 апреля 2010

У меня есть UIView с именем activityView, который содержит два подпредставления activityIndicator и cancelOperationsButton. Эти представления встроены в XIB и подключены к моему контроллеру представления.

У меня есть два способа активировать (показать) и деактивировать (скрыть) эти два подпредставления:

- (void) enableActivityIndicator {
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];
}

- (void) disableActivityIndicator {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}

Сами по себе эти два метода работают нормально.

Чтобы придать этому немного блеска, я бы хотел добавить анимацию, которая затухает в этих подпредставлениях:

- (void) enableActivityIndicator {
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    activityView.alpha = 1.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicator {
    [UIView beginAnimations:@"fadeOut" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    activityView.alpha = 0.0f;
    [UIView commitAnimations];

    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}

Но анимация не работает - подпредставления просто появляются или исчезают без свойства alpha родительского представления, влияющего на прозрачность.

Как мне написать эти методы, чтобы получить эффект постепенного появления, постепенного исчезновения, к которому я стремлюсь?

EDIT

Вот схема, которая отлично работает:

- (void) enableActivityIndicator {
    activityView.alpha = 0.0f;
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:0.2f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    activityView.alpha = 1.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicator {
    [UIView beginAnimations:@"fadeOut" context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(disableActivityIndicatorComplete)];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:0.2f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    activityView.alpha = 0.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicatorComplete {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}

1 Ответ

3 голосов
/ 29 апреля 2010

При включении установите очистку вида перед анимацией на непрозрачный.

- (void) enableActivityIndicator {
    ...
    activityView.alpha = 0.0f;
    [cancelOperationsButton setHidden:NO];
    ...

При отключении не скрывайте вид до тех пор, пока анимация не завершится.

- (void) disableActivityIndicator {
    ...
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(hideComplete)];
    ...

- (void) hideComplete {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}
...