2016-03-02 86 views
0

我遇到了一些小类不确定的动画NSProgressIndicator s。他们开始和停止动画没有任何问题。但是,如果在动画制作时将窗口最小化,则调用stopAnimation:/StopAnimation(NSObject sender),如果窗口不可见,则可以节省资源。我认为这是从可可框架本身看着堆栈跟踪调用的。恢复NSProgressIndicator动画后窗口最小化,然后恢复

问题出现在窗口恢复时,动画未被恢复。

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

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

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

这只是感觉脏,我会想象这是一个非常普遍的情况。那么,你应该怎样/恢复动画?我是来自主要.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:窗口委托方法来跟踪你的窗口状态和恢复进度条的状态下,当窗口deminiaturises(这真的是一个字吗?)。

HTH