Подтвердить что ты не робот

Разница между [UIView beginAnimations: context:] и [UIView animateWithDuration: анимация:]

Мне кажется, что эти два метода класса не являются взаимозаменяемыми. У меня есть подвид UIView со следующим кодом в методе touchhesBegan:

if (!highlightView) {
    UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Highlight"]];
    self.highlightView = tempImageView;
    [tempImageView release];

    [self addSubview:highlightView];
}

highlightView.alpha = 0.0;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
highlightView.alpha = 1.0;
[UIView commitAnimations];

Когда я касаюсь кнопки, подсветка исчезает, как и следовало ожидать. Когда я сразу прикоснусь (пока анимация не закончится), мои touchhesEnded вызывают. Это поведение, которое я хочу.

Но теперь я стал большим поклонником блоков и стараюсь использовать их там, где это возможно. Поэтому я заменил код анимации UIView следующим образом:

[UIView animateWithDuration:0.2 animations:^{
    highlightView.alpha = 1.0;
}];

Результаты: подсветка по-прежнему исчезает, как и ожидалось, но если я дотронусь до завершения анимации, мои touchhesEnded не будут вызваны. Если я коснусь после завершения анимации, мои вызовы touchesEnded получат вызов. Что здесь происходит?

4b9b3361

Ответ 1

Новые блоки анимации в iOS 4 по умолчанию отключают взаимодействие с пользователем. Вы можете передать параметр, позволяющий представлениям реагировать на касания во время анимации с использованием битовых флагов в сочетании с методом animateWithDuration:delay:options:animations:completion UIView как таковым:

UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction;

[UIView animateWithDuration:0.2 delay:0.0 options:options animations:^
{
    highlightView.alpha = 1.0;
} completion:nil];

Documentation

Ответ 2

Еще одна вещь: Appple не рекомендует использовать [UIView beginAnimations: context:], вы можете найти ее в beginAnimations docs

Использование этого метода не рекомендуется в iOS 4.0 и более поздних версиях. Вы должны использовать блочные методы анимации, чтобы указать ваши анимации.

Вероятно, Apple может пометить старые методы как устаревшие в будущих выпусках и не будет поддерживать их, поэтому использование блочных методов - действительно более предпочтительный способ для выполнения анимации.