Как активировать предварительный просмотр заставки в Cocoa / Obj-C? - PullRequest
0 голосов
/ 09 января 2011

Я создал довольно простую заставку, которая без проблем работает на Mac OS 10.6.5.

На экране конфигурации накопилось довольно много разных опций, и я пытаюсь реализовать свой собственный предварительный просмотр в окне configureSheet, чтобы пользователь (только я, в настоящее время) мог сразу же увидеть эффект от изменения, не нажимая OK и Test. каждое изменение.

Я добавил NSView в configureSheet и установил пользовательский класс в Интерфейсном Разработчике для моего подкласса ScreenSaverView. Я знаю, что drawRect: запускается, потому что я могу удалить условие очистки представления для черного, и мой предварительный просмотр больше не отображается на черном фоне. Вот эта функция (на основе нескольких прекрасных уроков в Интернете):

- (void)drawRect:(NSRect)rect
{
   if ( shouldDrawBackground ) 
   {
      [super drawRect:rect];
      shouldDrawBackground = NO;
   }
   if (pausing == NO)
      [spiroForm drawForm];
}

Класс spiroForm просто встраивается в кадр ScreenSaverView, используя NSBezierPath, и, как уже упоминалось, не представляет проблем для фактической заставки или встроенного предварительного просмотра системных настроек. Пользовательский кадр предварительного просмотра (configureView) передается в метод init для самой себя (поскольку его пользовательский класс - мой подкласс ScreenSaverView.) Метод -initWithFrame вызывается в configureSheet перед возвратом объекта configureSheet в ОС:

[configureView initWithFrame:[configureView bounds] isPreview:YES];

Может быть, мне не нужно этого делать? Я пытался понять, нужно ли это для рисования.

В конце концов я добавил делегата в configureSheet, чтобы попытаться вызвать функции startAnimation и stopAnimation моего предварительного просмотра с помощью уведомлений windowWillBeginSheet и windowWillEndSheet, но по некоторым причинам их не вызывают. Делегат объявлен как NSObject <NSWindowDelegate>, и я задал его в методе configureSheet перед возвратом объекта configureSheet.

Я работал над этим в течение нескольких дней, но не смог ничего найти о том, как ОС управляет объектами ScreenSaverView (что я думаю, это то, что я пытаюсь эмулировать, запустив свою собственную копию).

У кого-нибудь есть какие-либо предложения о том, как управлять этим, или если Apple что-то документирует, чего я не нашел? На самом деле это не требуется для работы заставки, я просто думаю, что это будет весело (я также искал способ использовать предварительный просмотр ОС, но он заблокирован, пока активирован configureSheet.)

1 Ответ

0 голосов
/ 16 января 2011

ОК, есть несколько «скучных» моментов, связанных с решением:

Прежде всего, я устанавливал делегата для уведомлений листа на сам лист. Окно, к которому листу принадлежит , получает уведомления.

Во-вторых, то самое окно, к которому принадлежит лист, принадлежит Системным настройкам, я не вижу способа установить мой класс делегата в качестве делегата этого окна, поэтому весь объект делегата не выглядит как жизнеспособное решение.

Я закончил создание подкласса NSWindow для configureSheet, чтобы я мог запускать и останавливать анимацию в моем предварительном просмотре, переопределив методы makeKeyWindow и close.

- (void) makeKeyWindow
{
   if (myPreview != nil)
      if ( ! [myPreview isAnimating])
      {
         [myPreview startAnimation];
      }
   [super makeKeyWindow];
}

Мне также пришлось добавить IBOutlet для самого объекта предварительного просмотра и подключить его в Интерфейсном Разработчике.

По-прежнему решаются некоторые проблемы, но теперь, когда я нажимаю кнопку «Параметры» на моей заставке, мой файл configureSheet опускается и отображает свой предварительный просмотр при настройке параметров. Sheesh. Обручи, которые я прыгаю для этих маленьких прелестей. Во всяком случае, мне это нравится. Вперед и вверх.

...