UIView animateWithDuration delay не задерживает анимацию

Я пытаюсь выполнить анимацию на ярлыке, где происходит флип-анимация, и после ее завершения и после задержки текст метки изменяется.

Кажется, что задержка никогда не происходит. Текст сразу же изменяется после завершения флип, хотя я использую UIView animateWithDuration:0.5 delay: 4.0 в блоке завершения. Если вместо этого я делаю performSelector с Delay в completion block (комментарий), он работает так, как ожидалось. Любая идея, почему значение задержки игнорируется?

- (void) flipShapeWithText:(NSString *)text {

    [UIView transitionWithView:someLabel duration:0.15 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        someLabel.text = text;  
    }completion:^ (BOOL finished){
//        [self performSelector:@selector(updateLabelText:) withObject: @"New Text" afterDelay:4.0];
    [UIView animateWithDuration:0.5
                              delay:4.0
                            options: UIViewAnimationOptionTransitionCrossDissolve
                         animations:^{
                             currentShapeNameLabel.text =  @"New Text" ;}
                         completion:nil];
    }];
}

Ответ 1

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

    [UIView animateWithDuration:0.5
                          delay:4.0
                        options: UIViewAnimationOptionTransitionCrossDissolve
                     animations:^{ // anything animatable }
                     completion:^(BOOL finished) {
                         currentShapeNameLabel.text =  @"New Text" ;}];

Вы можете устранить задержку, если хотите, чтобы анимация начала немедленно. Если вы хотите, чтобы изменение текста произошло через 4 секунды после завершения анимации, добавьте эту задержку в блок завершения либо с помощью dispatch_after(), либо performSelector:withDelay:.

Ответ 2

В моем случае проблема заключалась в том, что ранее в коде я вызывал UIView snapshotViewAfterScreenUpdates со значением true. После изменения этого параметра на false он работал нормально.

Ответ 3

попробуйте вложить в

dispatch_async(dispatch_get_main_queue(), ^{
});