2016-03-02 87 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