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

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

4b9b3361

Ответ 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 для завершения блока анимации. Анимации запускаются в отдельном потоке и начинаются, когда приложение возвращается в цикл выполнения. Другие методы класса анимации позволяют вам контролировать время начала, продолжительность, задержку и кривую анимации внутри блока.