str*_*nge 8 cocoa core-animation objective-c nsanimationcontext
我正在制作一个视图(通过揭示它),之后我需要发布一个通知(一旦动画完成).然而,应用程序的设计方式,隐藏视图(通过动画)时会发出另一个通知.基本上我有一个'showView'和'hideView'方法.每个人都这样做:
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration: 0.25];
[[myView animator] setAlphaValue: 0];
} completionHandler:^{
// post notification now
}];
Run Code Online (Sandbox Code Playgroud)
问题是在后台的另一个线程中,我有一个定期计时器,它执行"健全性检查"以查看是否需要隐藏视图(如果不需要).这是一种积极的方法,但必要的是应用程序的许多组件响应不同的事件和场景.由于这个原因,我有时会得到一个'竞争条件',用户点击了'showView',但同时我们的一个线程感觉应该立即隐藏视图.
当两者都在主线程上发布通知时,应用程序会在SpinLock中无限期挂起.如果我能够弄清楚上面的动画块是否被"取消"(即在同一视图上执行的另一个动画块),我可以完全避免这种情况.在这种情况下,我不会发布通知,这将不会强制检查.
长话短说:我需要能够检查动画成功结束后是否调用'completionHandler',或者是否取消了.我知道在iOS中这是可能的,但我在OS X中找不到任何方法.请帮忙.
我遇到了类似的问题。我通过使用currentAnimationUUID实例变量解决了这个问题。
NSUUID *animationUUID = [[NSUUID alloc] init];
self.currentAnimationUUID = animationUUID;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// set properties to animate
} completionHandler:^{
BOOL isCancelled = ![self.currentAnimationUUID isEqual:animationUUID];
if (isCancelled) {
return;
}
self.currentAnimationUUID = nil;
// do stuff
}];
Run Code Online (Sandbox Code Playgroud)
斯威夫特版本:
let animationUUID = UUID()
currentAnimationUUID = animationUUID
NSAnimationContext.runAnimationGroup({ context in
// set properties to animate
}, completionHandler: {
let isCancelled = self.currentAnimationUUID != animationUUID
guard !isCancelled else {
return
}
self.currentAnimationUUID = nil
// do stuff
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |