3

我可以使用代码以动画方式移动图层托管视图:

[CATransaction setAnimationDuration:2];
self.imageLayer.position = CGPointMake(0, 0);

我也可以通过以下代码来做到这一点:

 [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:2];
    self.imageLayer.position = CGPointMake(0, 0);
} completionHandler:nil];

我想知道 CATransaction 和 NSAnimationContext 之间有什么区别,我应该使用哪一个来为视图设置动画?为什么我可以在 NSAnimationContext 和 CATransaction 中设置持续时间?

4

2 回答 2

4

CATransaction 适用于核心动画层动画。CATransaction 是 iOS 和 Mac OS 之间的跨平台。

NSAnimationContext 与 NSAnimationContext 一起工作。它是特定于 Mac OS 的。

(NS 动画仅适用于 Mac,而 UIView 动画仅适用于 iOS。)

这些天,我在 iOS 上工作的时间比在 Mac OS 上的多,而且我一直在寻找跨平台的方法来做事。

CAAnimation、CALayer、CAAnimationGroup 等在 Mac 和 iOS 之间几乎相同。有一些差异(例如,iOS 中不支持 quicktime 层,iOS 中对 Core Image 的支持更有限等),但 CA 的东西更像是相似的而不是不同的。

于 2012-09-10T20:22:57.990 回答
4

大多数情况NSAnimationContext下是作为CATransaction. 您可以使用像Hopper这样的反汇编工具对 AppKit 的代码进行逆向工程,然后自己查看。以下是NSAnimationContext伪Objective-C中的一些重构方法:

void +[NSAnimationContext beginGrouping](void * self, void * _cmd) {
  if (([CATransaction currentState] & 0x3) != 0x0) {
    [CATransaction begin];
  } else {
    rdi = @class(CATransaction);
    if (pthread_main_np() != 0x0) {
      [rdi activate];
      [CATransaction begin];
    }
    else {
      [rdi begin];
      [CATransaction activateBackground:0x1];
    }
  }
  [CATransaction setValue:@(YES) forKey:@"NSAnimationContextBeganGroup"];
  return;
}

void +[NSAnimationContext endGrouping](void * self, void * _cmd) {
  [CATransaction commit];
  return;
}

void -[NSAnimationContext setTimingFunction:](void * self, void * _cmd, void * arg2) {
  [CATransaction setAnimationTimingFunction:arg2];
  return;
}

除此之外,它NSAnimationContext还有一些附加功能,例如如果按下 shift 键 ( NSAnimationSlowMotionOnShift) 则更改动画持续时间和测量性能。

于 2016-09-28T07:47:50.987 回答