Разница между [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 получат вызов. Что здесь происходит?
Ответы
Ответ 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 может пометить старые методы как устаревшие в будущих выпусках и не будет поддерживать их, поэтому использование блочных методов - действительно более предпочтительный способ для выполнения анимации.