Возобновить анимацию NSProgressIndicator после того, как окно свернуто, а затем восстановлено

У меня проблемы с анимацией некоторых подклассов неопределенных NSProgressIndicator. Они начинают и останавливают анимацию без каких-либо проблем. Однако, если я сворачиваю окно во время анимации, вызывается stopAnimation:/StopAnimation(NSObject sender), что имеет смысл для экономии ресурсов, если окно не видно. Я предполагаю, что это вызывается из самой структуры какао, глядя на трассировку стека.

Проблема то возникает при восстановлении окна, анимация не возобновляется.

Я видел, что вы можете использовать NSCoding Protocol и может переопределить encodeWithEncoder: / EncodeTo(NSCoder encoder) для сохранения некоторого состояния, а затем использовать это сохраненное состояние в initWithCoder: / AppProgressIndicatorBar(NSCoder coder) для возобновления работы. Но вот проблема была в том, что мой encodeWithEncoder:/EncodeTo(NSCoder encoder) так и не позвонили.

Глядя на этот SO вопрос и answer, он должен обрабатываться автоматически, если объект необходимо сериализовать. Так что я не уверен, почему это не называется.

В том же ответе говорится, что вы можете сделать это явно с помощью NSKeyedArchiver, но тогда мне нужно будет слушать с помощью NSWindowDelegate, чтобы знать, когда окно сворачивается/восстанавливается. В этом случае я мог бы просто использовать это и не использовать протокол NSCoding...

Это просто кажется грязным, и я полагаю, что это очень распространенный сценарий. Итак, как вы должны возобновить анимацию? Я новичок в какао, в основном работаю с .NET, и я думаю, что эта проблема является признаком моих ограниченных знаний о какао.

Я использую Xamarin Mac и пытался дать сигнатуры методов Objective-C и C#. Я буду рад найти решение в любом из них, я смогу (надеюсь!) преобразовать его в эквивалент С#.

Для полноты вот мой текущий подкласс Xamarin Mac, использующий протокол NSCoder, где 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);

        ...
    }

    ...
}

person Darren Hale    schedule 02.03.2016    source источник


Ответы (1)


Вы должны иметь возможность использовать уведомления NSWindowWillMiniaturizeNotification, NSWindowDidMiniaturizeNotification и NSWindowDidDeminiaturizeNotification или методы делегата окна windowWillMiniaturize:, windowDidMiniaturize: и windowDidDeminiaturize:, чтобы отслеживать состояние вашего окна и восстанавливать состояние вашего индикатора выполнения, когда окно деминиатюризируется (это действительно слово?) .

ХТН

person CRD    schedule 03.03.2016