#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:
самостоятельно. Представление изображения будет отображаться само по себе, как следствие нахождения в иерархии представлений.