2012-05-11 90 views
15

我知道一吨的人都问了同样的问题,但没有提出的解决方案似乎相关,所以我再次问: 我有下面的代码块:animateWithDuration立即完成

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"); 
          } 
      ]; 
     } 

我会认为应该动画我的钱箱框架。不幸的是,这似乎是立即发生的,而不是持续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. 

在此先感谢!

+0

很高兴看到你有什么可能导致问题的理论。你可以通过将动画代码临时复制到别的地方来测试它,看看它是否像你期望的那样行事? –

+0

以及我移动了willDisplayCell方法之外的代码,它的工作......有谁知道为什么它不会在willDisplayCell内工作? – akhalsa

+0

我的猜测是willDisplayCell的绘图代码会调用单元图层上的removeAllAnimations,从而过早地结束您的动画。 –

回答

17

引述文档:

帧中的框架矩形,它描述了图的位置和大小 在它的父的坐标系统。

此属性的更改可以为动画。但是,如果变换 属性包含非标识转换,则框架 属性的值未定义,因此不应修改。在这种情况下,您可以使用中心属性重新定位视图,并使用bounds属性调整大小 。

如果您或其他代码已更改视图的转换矩阵,则对帧属性所做的更改无法按预期工作。

您应该改变中心属性(移动视图)和边界属性(改变它的大小)。这些属性的行为如预期。

+0

好引用! ;) – Daniel

+0

我总是喜欢动画/改变中心属性,而不是frame.origin。不仅仅是因为提到的问题,还因为它更直观。(另外,iOS/Mac OS的frame.origin位置不同) –

+1

使用'center'作为定位属性时必须注意的事项如果你的框架有一个奇怪的像素宽度或高度。在这种情况下将中心设置为整数坐标将导致视图变得模糊,因为它不会像素对齐。 –

0

导致动画立即完成的另一件事是,如果被动画的对象(在我的情况下为UIImageView)为零。

4

在我的情况下,动画在viewdidload方法中调用。不要这样做。试一试viewWillAppear

相关问题