gpt4 book ai didi

objective-c - 当动画可能发生时释放窗口

转载 作者:行者123 更新时间:2023-12-03 16:54:42 24 4
gpt4 key购买 nike

我的AppDelegate维护事件窗口 Controller 的列表,以避免ARC过早地释放它们。所以我有一个像这样的通知处理程序:

- (void) windowWillClose: (NSNotification*) notification {
[self performSelectorOnMainThread: @selector(removeWindowControllerInMainThread:)
withObject: windowController
waitUntilDone: NO];
}

- (void) removeWindowControllerInMainThread: (id) windowController {
[windowControllers removeObject: windowController];
}

我使用主线程,因为在通知线程上进行处理存在在 Controller 准备好之前释放 Controller 的风险。

现在,这工作得很好 - 除非当前有动画师正在运行。我在某些地方通过 NSAnimationContext 使用动画师。我看过this QA ,而答案是 Not Acceptable 。等待一段时间就为了完成动画,实在是粗制滥造,而且不保证有效;确实没有。我尝试使用performSelector:withObject:afterDelay,即使延迟比当前动画持续时间更大,它仍然会导致动画师针对零对象运行。

像这样进行 Controller 清理的首选方法是什么?不使用 NSAnimationContext 而是使用 NSAnimation 来代替,它有一个 stopAnimation 方法?

最佳答案

首先,如果你的一些动画无限期地运行——或者运行很长时间——你就必须有办法阻止它们。

但是对于 View 上的隐式动画之类的事情,您可以简单地使用完成方法。

  self.animating=YES;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
[[v animator] setAlphaValue: 1];
} completionHandler:^{
self.animating=NO;
}];

现在,您只需轮询动画是否正在运行,如果没有运行,则继续关闭窗口。

进行轮询的一个好方法是设置一个具有固定延迟的计时器。如果动画仍在运行,只需重置计时器并等待另一个时间间隔。

或者,您可以从完成处理程序发送通知。

关于objective-c - 当动画可能发生时释放窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14925066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com