我可以使用代码动画地移动图层冲洗视图:
[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中设置时长?
发布于 2012-09-11 04:22:58
CATransaction处理核心动画层动画。CATransaction是iOS和Mac之间的跨平台。
NSAnimationContext与NSAnimationContext一起工作。这是特定于Mac OS的。
( NS动画内容仅适用于iOS,UIView动画内容仅适用于Mac。)
这些天我更多的是在iOS上工作,而不是Mac,我总是在寻找跨平台的方式来做事情。
CAAnimation、CALayer、CAAnimationGroup等在Mac和iOS之间几乎是一样的。有一些不同(例如,iOS不支持quicktime层,iOS对核心图像的支持更有限,等等)但是CA的东西与其说是不同,不如说是相似。
发布于 2016-09-28 15:47:51
在大多数情况下,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)和测量性能。
https://stackoverflow.com/questions/12355371
复制相似问题