1

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

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

NSView在 configureSheet 中添加了一个,并将 Interface Builder 中的自定义类设置为我的 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和功能,但由于某种原因,这些似乎没有被调用。委托被声明为,我在返回 configureSheet 对象之前在 configureSheet 方法中设置了委托。stopAnimationwindowWillBeginSheetwindowWillEndSheetNSObject <NSWindowDelegate>

我已经为此工作了好几天,但无法找到有关操作系统如何管理 ScreenSaverView 对象的任何信息(我认为这是我试图通过运行自己的副本来模拟的内容。)

有人对如何管理这个有任何建议,或者苹果是否在我没有找到的地方记录了它?这对于屏幕保护程序来说并不是真正需要的,我只是觉得它会很有趣(我还寻找了一种使用操作系统预览的方法,但是在激活 configureSheet 时它被阻止了。)

4

1 回答 1

1

好的,解决方案涉及几个“duh”时刻:

首先,我将工作表通知的委托设置为工作表本身。工作表所属的窗口获取通知。

其次,工作表所属的那个窗口属于系统偏好设置,我看不出有任何方法可以将我的委托类设置为该窗口的委托,因此整个委托似乎不是一个可行的解决方案。

我最终为 configureSheet 子类化了 NSWindow,以便我可以通过覆盖 makeKeyWindow 和 close 方法来启动和停止预览上的动画。

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

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

仍然解决了几个问题,但是现在当我单击屏幕保护程序选项按钮时,我的 configureSheet 下拉并在您设置选项时显示其自己的预览。嘘。我跳过这些小细节的箍。无论如何,我喜欢它。步步高升。

于 2011-01-16T01:22:56.570 回答