多个监视器中的不同内容[Objective-C - ScreenSaverView]

时间:2012-02-08 12:51:21

标签: objective-c macos screensaver multiple-monitors

我第一次在这里写点什么。我有一个问题,希望有人能给我一个答案。

我正在使用Objective-C为Mac OS X Lion开发屏幕保护程序。我已经阅读了一些关于如何使用ScreenSaverView的教程。一切都很完美,直到我插入另一台显示器。然后程序运行所有方法两次(加载xml文件两次)和类似的东西。什么是解决方案?

我应该使用除ScreenSaverView以外的其他内容吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我通常使用单例(全局变量initialed为true)来解决这个问题:

static BOOL gFirst = YES;

然后在类初始化方法中,我将它的值保存到ivar&然后设置全局false:

- (id) initWithFrame: (NSRect) frameRect isPreview: (BOOL) isPreview {

    preview = first = NO;     // assume failure (pessimist!)
    if ( isPreview ) {
        preview = YES;        // remember this is the preview instance
    } else if ( gFirst ) {    // if the singleton is still true
        gFirst = NO;          // clear the singleton
        first = YES;          // and set the ivar
    }

注意:我还将isPreview标志保存到ivar,并且当它为真时不要清除/设置第一个global / ivar。因此,当isPreview为true时,此处的逻辑将预览设置为true,否则将在第一次实例化此类(当isPreview为false时)时首先设置为true,否则将设置为false。

现在在drawRect我使用预览&第一个ivar影响得到的东西......:

- (void) drawRect: (NSRect) inRect {
    if ( preview || first ) {
        // ADD THE DRAWING CODE FOR THE 1ST MONITOR (or preview view) HERE
    } else {
        // ADD THE DRAWING CODE FOR THE NTH MONITOR(S) HERE
        [super drawRect:inRect];    // draw the default black background
    }
}

注意:有些屏幕保护程序在animateOneFrame方法中进行绘制,因此您可能需要在上面移动上面的预览/第一个逻辑。