窗口最小化再恢复后恢复 NSProgressIndicator 动画

Posted

技术标签:

【中文标题】窗口最小化再恢复后恢复 NSProgressIndicator 动画【英文标题】:Resume NSProgressIndicator animation after window minimised and then restored 【发布时间】:2016-03-02 23:14:14 【问题描述】:

我遇到了一些子类不确定NSProgressIndicators 的动画问题。他们开始和停止动画没有任何问题。但是,如果我在制作动画时最小化窗口,则会调用 stopAnimation: / StopAnimation(NSObject sender),如果窗口不可见,这对于节省资源是有意义的。我假设这是从可可框架本身查看堆栈跟踪调用的。

然后当窗口恢复时出现问题,动画没有恢复。

我看到您可以使用NSCoding Protocol 并可以覆盖encodeWithEncoder: / EncodeTo(NSCoder encoder) 来保存一些状态,然后使用initWithCoder: / AppProgressIndicatorBar(NSCoder coder) 中保存的状态来恢复。但这里的问题是我的encodeWithEncoder: / EncodeTo(NSCoder encoder) 从未被调用过。

看这个SOquestion和answer,如果对象需要序列化应该自动处理。所以我不确定为什么它没有被调用。

同样的答案说你可以用NSKeyedArchiver 明确地做到这一点,但是我需要用NSWindowDelegate 来听才能知道窗口何时最小化/恢复。在这种情况下,我可以只使用它,而不使用 NSCoding 协议...

这只是感觉很脏,我想这是一个非常常见的场景。那么应该/如何恢复动画?我是 cocoa 的新手,主要来自 .NET 背景,我认为这个问题是我对可可知识有限的症状。

我正在使用 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);

        ...
    

    ...

【问题讨论】:

【参考方案1】:

您应该能够使用NSWindowWillMiniaturizeNotificationNSWindowDidMiniaturizeNotificationNSWindowDidDeminiaturizeNotification 通知或windowWillMiniaturize:windowDidMiniaturize:windowDidDeminiaturize: 窗口委托方法来跟踪窗口的状态并恢复窗口的状态窗口缩小时的进度条(真的是一个词吗?)。

HTH

【讨论】:

以上是关于窗口最小化再恢复后恢复 NSProgressIndicator 动画的主要内容,如果未能解决你的问题,请参考以下文章

MFC CMFCToolBar 最小化恢复工具栏显示异常

qt窗口化怎么恢复全屏

如何恢复Eclipse左侧窗口?

qt窗口化怎么恢复全屏

Qt中窗体总是在最前面,如何取消此状态

如何获得最小化窗口的恢复边界?