делает animateWithDuration: animations: блокировать основной поток? - PullRequest
38 голосов
/ 13 июля 2010

Я соединил два метода ниже для разделения кнопок в моем пользовательском интерфейсе, но заметил, что после нажатия кнопки «ВЕРСИЯ 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];
}

Приветствия Гэри

Ответы [ 2 ]

92 голосов
/ 13 июля 2010

Анимация с блоками не блокирует основной поток. Я думаю, что поведение вы видите, потому что, по умолчанию, взаимодействие с пользователем отключено анимация продолжительности с новыми вызовами блоков. Вы можете переопределить это, передав 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];
}
1 голос
/ 13 июля 2010

Для animateWithDuration: ссылка на класс ничего не говорит о многопоточности, поэтому я не уверен.

Для beginAnimations:context: and commitAnimation: да, они запускаются в отдельном потоке UIView класс Ссылка .

Некоторые изменения свойств для просмотра объектов могут быть анимированными - например, установка свойств рамки, границ, центра и преобразования. Если вы измените эти свойства в блоке анимации, изменения из текущего состояния в новое состояние будут анимированными. Вызвать метод beginAnimations: context: class, чтобы начать анимационный блок, установить свойства, которые вы хотите анимировать, а затем вызвать метод класса commitAnimations, чтобы завершить блок анимации. Анимации запускаются в отдельном потоке и начинаются, когда приложение возвращается в цикл выполнения. Другие методы класса анимации позволяют вам контролировать время начала, продолжительность, задержку и кривую анимации в блоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...