Как отобразить анимированный gif в плагине экранной заставки?

#objective-c #macos #animated-gif #screensaver

#objective-c #macos #анимированный-gif #заставка

Вопрос:

Итак, я новичок в objective-c. (неважно, но я с нетерпением жду swift!: D) и я пытаюсь создать плагин для экранной заставки, который будет отображать анимированный gif.

Моей первой попыткой было создать NSBitmapImageRep и получить отдельные кадры из свойства representations NSImageFrameCount и NSImageCurrentFrame после получения NSData объекта (сжатый формат представления) из NSImage объекта, который был инициализирован с содержимым из url.

Это с треском провалилось.

Вторая попытка, которую я предпринял, действительно сработала, но она не анимировала gif. Он отображал только первый кадр. Что я сделал, так это создал NSImage с содержимым url, а затем вызвал drawInRect в методе ScreenSaverView drawRect .

Я попробовал еще раз, прежде чем обратиться за помощью к stack overflow. Вот мой текущий код: codebin

Для моей последней попытки я подумал, может быть, снова создать NSImageview настройку изображения на NSImage инициализированное с содержимым из url и нарисовать представление в методе рисования ScreenSaverView. Но это бессмысленно, потому что я создаю представление в представлении без причины.

Теперь я застрял, и мой вопрос таков: как вы воспроизводите анимированный gif в ScreenSaverView?

Комментарии:

1. В обычном контексте приложения вы можете просто поместить an NSImageView в свою иерархию представлений, установить для него image значение NSImage загружено из анимирующего gif и убедиться animates , что свойство представления изображения равно YES . Может сработать, если поместить такой вид изображения в ваш ScreenSaverView и просто вызвать [self setNeedsDisplay:YES] его -animateOneFrame метод.

2. Вам, конечно, нужно будет правильно установить рамку для просмотра изображения. Чтобы заполнить его супервизор, он должен быть установлен в границах его супервизора, а не в его рамке. Вы также хотели бы установить маску автоматического изменения размера, чтобы убедиться, что она отслеживает изменения размера супервизора, и установить для супервизора автоматическое изменение размера его вложенных представлений, если это еще не сделано. Вы бы не переопределяли -drawRect: в своем ScreenSaverView и, безусловно, не вызывали просмотр изображения -drawRect: самостоятельно. Представление изображения будет отображаться само по себе, как следствие нахождения в иерархии представлений.

3. хорошо, спасибо за быстрый ответ! Я собираюсь отредактировать свой код с учетом ваших предложений.

4. @KenThomases Вы хотели бы опубликовать свои комментарии в качестве ответа, чтобы я мог их принять?

Ответ №1:

В обычном контексте приложения вы можете просто поместить an NSImageView в свою иерархию представлений, установить для него image значение NSImage загружено из анимирующего gif и убедиться animates , что свойство представления изображения равно YES . Может сработать, если поместить такой вид изображения в ваш ScreenSaverView и просто вызвать [self setNeedsDisplay:YES] его -animateOneFrame метод.

Вам, конечно, нужно будет правильно установить рамку для просмотра изображения. Чтобы заполнить его супервизор, он должен быть установлен в границах его супервизора, а не в его рамке. Вы также хотели бы установить маску автоматического изменения размера, чтобы убедиться, что она отслеживает изменения в размере супервизора, и установить для супервизора автоматическое изменение размера его вложенных представлений, если это еще не сделано. Вы бы не переопределяли -drawRect: в своем ScreenSaverView и, безусловно, не вызывали просмотр изображения -drawRect: самостоятельно. Представление изображения будет отображаться само по себе, как следствие нахождения в иерархии представлений.