4

假设我制作了这样的动画:

[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                               someView.frame = CGRect(0, 100, 200, 200);
                             }
                 completion:nil];

假设我在someView中有子视图,它们的layoutSubviews方法被覆盖。我想在该layoutSubviews中识别一个正在进行的动画,并根据我检测到的动画是由我创建的,还是例如由设备旋转引起的动画来做出相应的操作。

为了获得正在进行的动画,我使用以下代码:

for (NSString *animationKey in [self.layer animationKeys])
{
    CAAnimation *animation = [self.layer animationForKey:animationKey];
    // ... Do something ...
}

现在,如果我要使用CABasicAnimation,我可以使用以下方法设置任意属性:

[myAnimation setValue:@"mySuperCoolAnimation" forKey:@"AnimationName"];

然后检查另一边的那个钥匙。但由于我的视图层次结构复杂,我想避免使用CABasicAnimation 。

所以为了简单起见,有没有办法使用UIView animateWithDuration 来做类似的事情:

4

1 回答 1

3

你能举个旗子说你的动画正在进行中,然后在完成块中降低它吗?

或者使用当前的 CATransaction 来存储任意键,就像您对 CABasicAnimation 所做的那样?一个鲜为人知的事实是总有一个 CATransaction,它会在运行循环结束时(在您自己的代码完成后)自动提交并运行动画,然后在完成时选择性地触发一个完成处理程序——也就是说,在事实上,这就是动画的工作原理,正如我在书中解释的那样:

http://www.aeth.com/iOSBook/ch17.html#_animation_transactions

(参见特别是“交易的真相”,在该页面的下方。)

这很酷,原因有很多:

  • 当前的 CATransaction 可从您的代码中获得,即使您的代码此时与动画无关。

  • 您可以进行自己的事务,包装动画并提交它(这可能是您所追求的解决方案;我不太清楚)

  • CATransaction 有一个完成处理程序。我经常使用这个技巧来做一些必须紧跟在我的一个动画之后的事情。

  • CATransaction 在其动画完成后触发其完成处理程序,即使它们不是您的动画;我将此技巧用作延迟性能的一种特殊形式,以等待运行时自己内部生成的动画之一结束。

  • CATransaction 可以存储任意键/值对,就像 CALayer 和 CAAnimation 一样。我经常使用它作为通过事务传递信号的方式,以便在完成处理程序运行时被拾取。

很抱歉在这里没有提出任何具体的解决方案,但我只是建议了解 CATransaction 可能会让您制定出适合您的情况的东西。

于 2013-03-23T16:39:39.790 回答