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) 完成:^
UIView、animateWithDuration 和完成的问题
在 animateWithDuration:completion 的完成块中删除 UIView