如何在Cocoa / Obj-C中激活自定义屏幕保护程序预览?

时间:2011-01-08 21:45:09

标签: objective-c cocoa macos screensaver

我创建了一个非常简单的屏幕保护程序,可以在Mac OS 10.6.5上运行而没有问题。

配置屏幕已经积累了很多不同的选项,我正在尝试在configureSheet窗口上实现我自己的预览,这样用户(只有我,当前)可以立即看到更改的效果而无需确定和测试每次改变。

我在configureSheet中添加了NSView,并将Interface Builder中的自定义类设置为我的ScreenSaverView子类。我知道drawRect:正在解雇,因为我可以删除将视图清除为黑色的条件,并且我的自定义预览不再显示黑色背景。 这是该功能(基于互联网上的几个精细教程):

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

spiroForm类只是使用NSBezierPath将自己绘制到ScreenSaverView框架中,并且如上所述,对于实际的屏幕保护程序或内置的“系统偏好设置”预览不会有问题。自定义预览(configureView)框架被传递给um本身的init方法(因为它的自定义类是我的ScreenSaverView子类。)在将configureSheet对象返回到OS之前,在configureSheet中调用-initWithFrame方法: / p>

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

也许我不必这样做?这只是我试图看到它是否需要绘图。

我最终在configureSheet中添加了一个委托,尝试通过startAnimationstopAnimation通知触发预览的windowWillBeginSheetwindowWillEndSheet功能,但这些功能不会出现因某种原因被召唤。委托声明为NSObject <NSWindowDelegate>,并在返回configureSheet对象之前在configureSheet方法中设置委托。

我已经做了好几天了,但是还没找到任何关于操作系统如何管理ScreenSaverView对象的东西(我认为这是我试图通过运行我自己的副本来模拟的。)< / p>

是否有人对如何管理此问题有任何建议?如果Apple将文档记录在我尚未找到的地方?这不是屏幕保护程序真正需要的工作,我只是觉得它很有趣(我也想办法使用操作系统预览,但是在激活configureSheet时它被阻止了。)

1 个答案:

答案 0 :(得分:0)

好的,解决方案中有几个'呃'的时刻:

首先,我正在将工作表通知的委托设置为工作表本身。工作表所属的窗口会收到通知。

其次,表单所属的窗口是由系统偏好设置所拥有的,我没有看到任何方法将我的委托类设置为该窗口的委托,因此整个委托事物似乎不是可行的解决方案。

我最后为configureSheet继承了NSWindow,这样我就可以通过覆盖makeKeyWindow和close方法在我的预览中启动和停止动画。

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

我还必须为我的预览对象本身添加一个IBOutlet,并在Interface Builder中连接它。

仍在解决几个问题,但现在当我点击我的屏幕保护程序选项按钮时,我的configureSheet会下拉并在您设置选项时显示自己的预览。啧。我为这些小小的细节跳了起来。无论如何,我喜欢它。向前和向上。