UIView的animateWithDuration延迟不会延迟动画

12
我正在尝试对一个标签执行动画,其中会发生翻转动画,并且在完成后经过一段时间后标签的文本会更改。但似乎延迟永远不会发生。尽管我在完成块中使用了 UIView animateWithDuration:0.5 delay:4.0 ,但文本立即更改。如果我在 completion block 中使用带有延迟的 performSelector (注释语句),那么它会按预期工作。有什么想法为什么延迟值被忽略了吗?
- (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];
    }];
}
3个回答

20

animateWithDuration:delay:options:animations:completiondelay参数指定了动画发生之前的延迟时间。您正在动画块中设置文本,因此在延迟结束后,动画开始并立即更改文本,因为这种更改无法进行动画化处理。要实现您想要的效果,请按照以下方式在完成块中更改文本:

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

如果你想让动画立即开始,可以消除延迟。如果你希望文本更改在动画完成4秒后发生,请在完成块中使用dispatch_after()performSelector:withDelay:添加该延迟。


FYI:根据当前苹果文档的状态,将nil设置为动画块的参数是非法的。 - Martin

9
在我的情况下,问题出在代码早期我使用了值为trueUIViewsnapshotViewAfterScreenUpdates方法。将其更改为false后,问题得到解决。

2
我也遇到了同样的问题,你通过调试帮我节省了一些时间,所以谢谢 :). 在我的情况下,我无法将这个值设置为false,所以我只是使用dispatch_after来执行这个特定的动画,它运行得很好。 - Ben Scheirman
这相当晦涩。干得好。 - Josh Bernfeld

-1

尝试嵌套

dispatch_async(dispatch_get_main_queue(), ^{
});

2
尝试在您的答案中提供更多细节,解释它如何解决问题。 - Toby Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接