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(), ^{
});