我可以使用代码动画移动图层分组视图:
[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中设置持续时间?
答案 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
)并测量性能,则会改变动画持续时间。