获取由UIView的animateWithDuration创build的animation的参考或通过任何其他方式识别它

假设我制作了这样一个animation:

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

假设我在someView中有子视图,它们的layoutSubviews方法被覆盖。 我想识别该布局中正在进行的animation,并根据我检测到的animation是由我创build的,还是例如由设备旋转导致的animation来做出相应的动作。

为了使animation进行中,我使用下面的代码:

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

现在如果我将使用CABasicAnimation,我可以设置任意属性使用:

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

然后检查另一侧的钥匙。 但我想避免使用CABasicAnimation,因为我的复杂的视图层次结构。

所以为了简单起见,有没有办法像使用UIView animateWithDuration那样做

你可以举一个标志来说你的animation正在进行,并在完成块中降低它?

或者使用当前的CATransaction来存储一个任意的键,就像你在CABasicAnimation中所做的那样? 这是一个鲜为人知的事实,总是有一个CATransaction,在运行循环结束时自动提交和运行animation(在你自己的代码完成之后),然后在完成处理时select性地触发完成处理程序 – 在事实上,animation是如何工作的,正如我在书中所解释的:

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

(特别参见页面下方的“关于事务的真相”。)

由于各种原因,这很酷:

  • 当前的CATransaction可以从你的代码中获得,即使你的代码在那个时候与animation无关。

  • 你可以做你自己的事务,包装你的animation,并提交它(这可能是你之后的解决scheme,我不明白)

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

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

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

对不起,不要在这里提出任何具体的解决scheme,但我只是build议,知道CATransaction可能会让你找出适合你的情况。