Does animateWithDuration: анимация: блокировать основной поток?
Я подключил два метода ниже, чтобы отделить кнопки в моем пользовательском интерфейсе, но заметил, что после нажатия кнопки "ВЕРСИЯ 1" я не мог нажать кнопку еще раз, пока не закончилась продолжительность анимации в этом методе. Я понял, что анимация использует свой собственный поток, чтобы не блокировать основное приложение.
// VERSION 1
-(IBAction)fadeUsingBlock {
NSLog(@"V1: Clicked ...");
[myLabel setAlpha:1.0];
[UIView animateWithDuration:1.5 animations:^{
[myLabel setAlpha:0.0];
}];
}
Более старая версия версии (ниже) позволяет нажатию кнопки до окончания таймера анимации, просто сбросив таймер, чтобы начать заново. Должны ли они оба работать одинаково, я что-то упустил или произошло изменение в работе между 3.2 и 4?
// VERSION 2
-(IBAction)fadeUsingOld {
NSLog(@"V2: Clicked ...");
[myLabel setAlpha:1.0];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.5];
[myLabel setAlpha:0.0];
[UIView commitAnimations];
}
Cheers gary
Ответы
Ответ 1
Анимация с помощью блоков не блокирует основной поток. Я думаю, что поведение, которое вы видите, связано с тем, что по умолчанию взаимодействие с пользователем отключается анимацией продолжительности с новыми вызовами блока. Вы можете переопределить это, передав UIViewAnimationOptionAllowUserInteraction (вызов animationWithDuration:delay:options:animations:completion
), например:
-(IBAction) fadeUsingBlock {
NSLog(@"V1: Clicked ...");
[myLabel setAlpha:1.0];
[UIView animateWithDuration:1.5
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[myLabel setAlpha:0.0];
}
completion:nil];
}
Ответ 2
Для animateWithDuration: ссылка на класс ничего не говорит о потоковом, поэтому я не уверен.
Для beginAnimations:context: and commitAnimation:
, да, они запускаются в отдельном потоке
Ссылка на класс UIView.
Некоторые изменения свойств для просмотра объектов могут быть анимированы - например, задание свойств фрейма, границ, центра и преобразования. Если вы измените эти свойства в блоке анимации, изменения из текущего состояния в новое состояние будут анимированы. Вызвать метод beginAnimations: context: class, чтобы начать блок анимации, установить свойства, которые вы хотите анимировать, а затем вызвать метод класса commitAnimations для завершения блока анимации. Анимации запускаются в отдельном потоке и начинаются, когда приложение возвращается в цикл выполнения. Другие методы класса анимации позволяют вам контролировать время начала, продолжительность, задержку и кривую анимации внутри блока.