animateWithDuration 立即完成

Posted

技术标签:

【中文标题】animateWithDuration 立即完成【英文标题】:animateWithDuration completes immediately 【发布时间】:2012-05-11 08:51:43 【问题描述】:

我知道很多人都问过同样的问题,但提议的解决方案似乎都不相关,所以我再次问: 我有以下代码块:

UIImageView *moneyHolder = [[UIImageView alloc] initWithImage:moneyImage];    
if([paymentMethod.viewed intValue] == 0)
            //CGRect targetFrame = CGRectMake(0, cell.frame.size.height/2-3, cell.frame.size.width, targetHeight);
            CGRect targetFrame = moneyHolder.frame;
            targetFrame.origin.y = cell.frame.size.height/2-3;
            NSLog(@"animating");
            [UIView animateWithDuration:2
                                  delay:0
                                options: UIViewAnimationCurveEaseOut
                             animations:^
                                 moneyHolder.frame = targetFrame;
                              
                             completion:^(BOOL finished)
                                 NSLog(@"done");
                             
            ];
        

我认为应该为我的 moneyHolder 框架设置动画。不幸的是,这似乎立即发生,而不是持续 2 秒。我可以使用日志中的时间戳来验证这一点:

2012-05-11 03:41:50.102 AgilePoet[5824:15203] 动画 2012-05-11 03:41:50.116 AgilePoet[5824:15203] 完成

有人对为什么会发生这种情况有任何想法吗?关于该主题的所有其他问题都集中在不可动画的属性上,但我知道 imageview 框架是可动画的。我唯一能想到的是这段代码是写在我的

里面的
-tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath method. 

提前致谢!

【问题讨论】:

很高兴看到您对可能导致问题的原因有一个理论。您可以通过将动画代码临时复制到其他地方来测试它,看看它的行为是否符合您的预期? 好吧,我把代码移到了 willDisplayCell 方法之外,它工作了......有谁知道为什么它不能从 willDisplayCell 内部工作? 我的猜测是 willDisplayCell 的绘图代码在单元格层上调用 removeAllAnimations ,从而过早结束您的动画。 你的解决方案是什么样的? 是的,如果可以的话,贴一些代码 【参考方案1】:

引用文档:

frame 框架矩形,描述视图的位置和 其父视图坐标系中的大小。

对此属性的更改可以设置动画。但是,如果变换 属性包含一个非恒等变换,帧的值 属性未定义,不应修改。在这种情况下,你 可以使用 center 属性重新定位视图并调整大小 改为使用 bounds 属性。

如果您或其他代码更改了视图的转换矩阵,则对 frame 属性的更改不会按预期工作。

您应该改为更改 center 属性(以移动视图)和 bounds 属性(以更改其大小)。这些属性的行为符合预期。

【讨论】:

我总是喜欢动画/更改中心属性而不是 frame.origin。不仅仅是因为上面提到的问题,还因为它更直观。(另外,ios/Mac OS 的 frame.origin 位置不同) 在使用“中心”作为定位属性时需要注意的是,如果您的框架具有奇数像素宽度或高度。在这种情况下将中心设置为整数坐标会导致您的视图变得模糊,因为它不会像素对齐。 @GregMaletic,在视网膜设备上这不是问题,因为您的坐标实际上是“点”坐标,而在视网膜设备上,一个点是 2 个屏幕像素。 Retina 设备能够在 1/2 点坐标处显示清晰的图像。【参考方案2】:

在我的例子中,动画是在 viewdidload 方法中调用的。不要这样做。试试 viewWillAppear

【讨论】:

【参考方案3】:

导致动画立即完成的另一件事是,动画对象(在我的例子中为 UIImageView)是否为零。

【讨论】:

以上是关于animateWithDuration 立即完成的主要内容,如果未能解决你的问题,请参考以下文章

线程解决方案,如 (animateWithDuration) 完成:^

在完成前停止 animateWithDuration

UIView、animateWithDuration 和完成的问题

在 animateWithDuration:completion 的完成块中删除 UIView

我的 animatewithduration,完成块只执行一次

UIView animateWithDuration 动画和完成参数的单独函数