Objective c 如何在Cocoa/Obj-C中激活自定义屏幕保护程序预览?
我已经创建了一个相当简单的屏幕保护程序,在MacOS10.6.5上运行,没有问题 配置屏幕已经积累了很多不同的选项,我正在尝试在configureSheet窗口上实现我自己的预览,这样用户(目前只有我)就可以立即看到更改的效果,而无需确定并测试每个更改 我在配置表中添加了一个Objective c 如何在Cocoa/Obj-C中激活自定义屏幕保护程序预览?,objective-c,cocoa,macos,screensaver,Objective C,Cocoa,Macos,Screensaver,我已经创建了一个相当简单的屏幕保护程序,在MacOS10.6.5上运行,没有问题 配置屏幕已经积累了很多不同的选项,我正在尝试在configureSheet窗口上实现我自己的预览,这样用户(目前只有我)就可以立即看到更改的效果,而无需确定并测试每个更改 我在配置表中添加了一个NSView,并将Interface Builder中的自定义类设置为我的ScreenSaverView子类。我知道drawRect:正在启动,因为我可以删除将视图清除为黑色的条件,并且我的自定义预览不再以黑色背景显示。 以
NSView
,并将Interface Builder中的自定义类设置为我的ScreenSaverView子类。我知道drawRect:
正在启动,因为我可以删除将视图清除为黑色的条件,并且我的自定义预览不再以黑色背景显示。
以下是该功能(基于互联网上的一些优秀教程):
spiroForm类只是使用NSBezierPath
将自己绘制到ScreenSaverView框架中,正如前面提到的,对于实际的屏幕保护程序或内置的系统首选项预览来说没有问题。自定义预览(configureView)框架被传递到本身的init方法中(因为它的自定义类是my ScreenSaverView子类)。在将configureSheet对象返回操作系统之前,在configureSheet中调用-initWithFrame
方法:
[configureView initWithFrame:[configureView bounds] isPreview:YES];
也许我不必那么做?我只是想看看画画是否需要它
我最终在配置表中添加了一个委托,尝试通过windowWillBeginSheet
和windowWillEndSheet
通知触发预览的startAnimation
和stopAnimation
功能,但这些功能似乎由于某种原因没有被调用。委托被声明为NSObject
,在返回configureSheet对象之前,我在configureSheet方法中设置了委托
我已经为此工作了好几天,但还没有找到任何关于操作系统如何管理ScreenSaverView对象的信息(我想这正是我试图通过运行自己的副本来模拟的)
有没有人对如何管理这一点有什么建议,或者苹果是否在我没有找到的地方记录了它?这并不是屏保工作所必需的,我只是觉得它很有趣(我也寻找了一种使用操作系统预览的方法,但在激活配置表时它被阻止了。)好的,解决方案涉及到一些“无聊”的时刻: 首先,我将工作表通知的委托设置为工作表本身。工作表所属的窗口获取通知 其次,工作表所属的窗口属于系统首选项,我看不到任何方法将我的委托类设置为该窗口的委托,因此整个委托问题似乎不是一个可行的解决方案 最后,我为configureSheet子类化了NSWindow,这样我就可以通过使用makeyWindow和close方法在预览中启动和停止动画
- (void) makeKeyWindow
{
if (myPreview != nil)
if ( ! [myPreview isAnimating])
{
[myPreview startAnimation];
}
[super makeKeyWindow];
}
我还必须为预览对象本身添加一个IBOutlet,并在Interface Builder中连接它
仍在解决一些问题,但现在当我单击我的屏幕保护程序选项按钮时,我的配置表会在您设置选项时下拉并显示其自己的预览。嘘。我为这些小细节而跳出的圈圈。不管怎样,我喜欢它。向前和向上。请花点时间使用编辑器控件正确格式化代码。感谢您的编辑,我不是一个经常在网上张贴的人,直到看到您的评论,我才注意到编辑器控件。
- (void) makeKeyWindow
{
if (myPreview != nil)
if ( ! [myPreview isAnimating])
{
[myPreview startAnimation];
}
[super makeKeyWindow];
}