cocoa:CATransaction和NSAnimationContext有什么不同

时间:2012-09-10 16:02:45

标签: cocoa core-animation

我可以使用代码动画移动图层分组视图:

[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中设置持续时间?

2 个答案:

答案 0 :(得分:3)

CATransaction适用于Core Animation图层动画。 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的内容更加相似而不同。

答案 1 :(得分:2)

大部分NSAnimationContext都是作为CATransaction的包装器实现的。您可以使用像Hopper这样的反汇编工具来反向设计AppKit的代码,并亲自查看。以下是伪Objective-C中的一些NSAnimationContext重建方法:

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还有一些额外的功能,例如,如果移位键关闭(NSAnimationSlowMotionOnShift)并测量性能,则会改变动画持续时间。