1

ScreenSaverViewサブクラスの設定シートを表示させようとしています。Xcode との長い戦いの後、システム環境設定で [スクリーン セーバー オプション] をクリックすると (そして私のスクリーン セーバーが選択されていると) 設定シートが表示されるようになりました。 、テキストを非表示にします (画像を参照)。構成シートの黒の背景。

これは、シートがNSPanelorNSWindowクラスであるかどうか、およびパネルが通常のパネル、ユーティリティ パネル、または HUD パネルであるかどうかに関係なく発生します。私ができる唯一のことは、パネルのアルファ値を変更することです。これにより、予想どおり、すべてがより透明になります (ただし、テキストはまだ表示されません)。興味深いことに、setOpaqueorsetBackgroundColorNSPanelorを呼び出しNSWindowても効果はないようです。

4

1 に答える 1

2

なぜ黒く表示されているのかを理解するには、ウィンドウを作成する方法のコードを確認する必要があります。

簡単なテスト プロジェクトを実行したところ、ここでは問題なく動作するようです。IMO、configureSheetメソッドで返すウィンドウを作成するための最も簡単な解決策は、NSWindowControllerサブクラスを使用して、事前にウィンドウを構成した nib ファイルをロードすることです。

したがって、ScreenSaverViewサブクラスでは、次のようなインターフェイスを定義します。

@interface MDScreenSaverFinaglerView : ScreenSaverView {
    MDScreenSaverOptionsWindowController        *optionsWindowController;

    NSInteger                                    screenSaverViewMode;
}

@property (nonatomic, retain) MDScreenSaverOptionsWindowController
                                             *optionsWindowController;

@property (nonatomic, assign) NSInteger screenSaverViewMode;

@end

configureSheetメソッドの実装は次のようになります。

- (NSWindow *)configureSheet {
    if (optionsWindowController == nil) {
        optionsWindowController = [[MDScreenSaverOptionsWindowController alloc]
                                                  initWithScreenSaverView:self];
    }
    return optionsWindowController.window;
}

optionsWindowController基本的に、インスタンスが存在するかどうかを確認し、必要に応じて作成してから、その を返しますwindow

カスタムNSWindowControllerサブクラスのインターフェイスは次のようになります。

@interface MDScreenSaverOptionsWindowController : NSWindowController {
    IBOutlet NSMatrix                *optionsMatrix;

    MDScreenSaverFinaglerView        *screenSaverView;    // non-retained/weak reference
}

- (id)initWithScreenSaverView:(MDScreenSaverFinaglerView *)aView;

@property (nonatomic, assign) MDScreenSaverFinaglerView *screenSaverView;

- (IBAction)ok:(id)sender;

@end

ユーザーが [OK] ボタンをクリックすると、サブクラスとの通信を許可するscreenSaverViewプロパティがあります。ScreenSaverView

クラスの nib ファイルMDScreenSaverOptionsWindowController(「MDScreenSaverOptionsWindowController.xib」という名前) は、次のように設定されています。

ここに画像の説明を入力

の実装は次のMDScreenSaverOptionsWindowControllerようになります。

@implementation MDScreenSaverOptionsWindowController

@synthesize screenSaverView;

- (id)initWithScreenSaverView:(MDScreenSaverFinaglerView *)aView {
    NSParameterAssert(aView != nil);
    if ((self = [super initWithWindowNibName:NSStringFromClass([self class])])) {
        self.screenSaverView = aView;
    }
    return self;
}

- (void)windowDidLoad {
    [super windowDidLoad];
    [optionsMatrix selectCellWithTag:screenSaverView.screenSaverViewMode];
}

- (IBAction)ok:(id)sender {
    NSInteger viewMode = [optionsMatrix selectedTag];
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber
                  numberWithInteger:viewMode] forKey:MDScreenSaverViewModeKey];
    screenSaverView.screenSaverViewMode = viewMode;
    [NSApp endSheet:self.window];
}
@end

最終結果:

ここに画像の説明を入力

サンプル プロジェクト: ScreenSaverFinagler.zip

于 2013-02-12T00:40:15.213 に答える