在 window 最小化然后恢复后恢复 NSProgressIndicator 动画
Resume NSProgressIndicator animation after window minimised and then restored
我在处理某些子类不确定 NSProgressIndicator
的动画时遇到了问题。他们开始和停止动画没有任何问题。但是,如果我在设置动画时最小化 window,则会调用 stopAnimation:
/ StopAnimation(NSObject sender)
,如果 window 不可见,这样可以节省资源。我假设这是从查看堆栈跟踪的 cocoa 框架本身调用的。
然后问题就出现了window恢复的时候,动画没有恢复。
我看到你可以使用 NSCoding Protocol
并且可以覆盖 encodeWithEncoder:
/ EncodeTo(NSCoder encoder)
来保存一些状态,然后在 initWithCoder:
/ AppProgressIndicatorBar(NSCoder coder)
继续。但这里的问题是我的 encodeWithEncoder:
/ EncodeTo(NSCoder encoder)
从未被调用过。
看这个SOquestion and answer,如果对象需要序列化,应该会自动处理。所以我不确定为什么它没有被调用。
同样的答案说你可以用 NSKeyedArchiver
明确地做到这一点,但是我需要用 NSWindowDelegate
来听,以了解 window 何时正在最小化/恢复。在这种情况下,我可以只使用它,而不使用 NSCoding 协议...
这感觉很脏,我想这是一个很常见的场景。那么你应该/如何恢复动画呢?我是 cocoa 的新手,主要来自 .NET 背景,我认为这个问题是我 cocoa 知识有限的症状。
我正在使用 Xamarin Mac,并尝试提供 Objective-C 和 C# 方法签名。我很乐意在任何一个中找到解决方案,我将能够(希望如此!)将其转换为 C# 等价物。
为了完整起见,这是我当前使用 NSCoder 协议的 Xamarin Mac 子类,其中 EncodeTo
未被调用。我是 运行 OS X 10.11.3 和 Xamarin Studio 5.10.2。
[Register("AppProgressIndicatorBar")]
public class AppProgressIndicatorBar : NSProgressIndicator, INSCoding
{
...
public AppProgressIndicatorBar(NSCoder coder) : base(coder)
{
...
}
...
public override void EncodeTo(NSCoder encoder)
{
base.EncodeTo(encoder);
...
}
...
}
您应该可以使用 NSWindowWillMiniaturizeNotification
、NSWindowDidMiniaturizeNotification
和 NSWindowDidDeminiaturizeNotification
通知或 windowWillMiniaturize:
、windowDidMiniaturize:
和 windowDidDeminiaturize:
Window 委托方法来跟踪 window 的状态并在 window 去微型化时恢复进度条的状态(这真的是一个词吗?)。
HTH
我在处理某些子类不确定 NSProgressIndicator
的动画时遇到了问题。他们开始和停止动画没有任何问题。但是,如果我在设置动画时最小化 window,则会调用 stopAnimation:
/ StopAnimation(NSObject sender)
,如果 window 不可见,这样可以节省资源。我假设这是从查看堆栈跟踪的 cocoa 框架本身调用的。
然后问题就出现了window恢复的时候,动画没有恢复。
我看到你可以使用 NSCoding Protocol
并且可以覆盖 encodeWithEncoder:
/ EncodeTo(NSCoder encoder)
来保存一些状态,然后在 initWithCoder:
/ AppProgressIndicatorBar(NSCoder coder)
继续。但这里的问题是我的 encodeWithEncoder:
/ EncodeTo(NSCoder encoder)
从未被调用过。
看这个SOquestion and answer,如果对象需要序列化,应该会自动处理。所以我不确定为什么它没有被调用。
同样的答案说你可以用 NSKeyedArchiver
明确地做到这一点,但是我需要用 NSWindowDelegate
来听,以了解 window 何时正在最小化/恢复。在这种情况下,我可以只使用它,而不使用 NSCoding 协议...
这感觉很脏,我想这是一个很常见的场景。那么你应该/如何恢复动画呢?我是 cocoa 的新手,主要来自 .NET 背景,我认为这个问题是我 cocoa 知识有限的症状。
我正在使用 Xamarin Mac,并尝试提供 Objective-C 和 C# 方法签名。我很乐意在任何一个中找到解决方案,我将能够(希望如此!)将其转换为 C# 等价物。
为了完整起见,这是我当前使用 NSCoder 协议的 Xamarin Mac 子类,其中 EncodeTo
未被调用。我是 运行 OS X 10.11.3 和 Xamarin Studio 5.10.2。
[Register("AppProgressIndicatorBar")]
public class AppProgressIndicatorBar : NSProgressIndicator, INSCoding
{
...
public AppProgressIndicatorBar(NSCoder coder) : base(coder)
{
...
}
...
public override void EncodeTo(NSCoder encoder)
{
base.EncodeTo(encoder);
...
}
...
}
您应该可以使用 NSWindowWillMiniaturizeNotification
、NSWindowDidMiniaturizeNotification
和 NSWindowDidDeminiaturizeNotification
通知或 windowWillMiniaturize:
、windowDidMiniaturize:
和 windowDidDeminiaturize:
Window 委托方法来跟踪 window 的状态并在 window 去微型化时恢复进度条的状态(这真的是一个词吗?)。
HTH