6

NSViewをグラデーションで塗りつぶそうとしています。ウィンドウが背景にある場合、グラデーションはウィンドウの残りの部分と一致するように明るい色にする必要があります。以下のコードには多くのアーティファクトがあります。ウィンドウが最初に描画されるとき、背景色で描画されます。ウィンドウのサイズが変更されると、前景色が使用されます。ウィンドウを後ろに移動すると、背景色が期待どおりに使用されません。このタスクにisKeyWindowを使用するべきではありませんか?

- (void)drawRect:(NSRect)dirtyRect {

    if ([[self window] isKeyWindow]) {

        NSColor *startingColor = [NSColor colorWithCalibratedWhite:0.8 alpha:1.0];
        NSColor *endingColor = [NSColor colorWithCalibratedWhite:0.6 alpha:1.0];
        NSGradient* aGradient = [[NSGradient alloc]
                             initWithStartingColor:startingColor
                             endingColor:endingColor];
        [aGradient drawInRect:[self bounds] angle:270];

    } else {
        NSColor *startingColor = [NSColor colorWithCalibratedWhite:0.9 alpha:1.0];
        NSColor *endingColor = [NSColor colorWithCalibratedWhite:0.8 alpha:1.0];
        NSGradient* aGradient = [[NSGradient alloc]
                             initWithStartingColor:startingColor
                             endingColor:endingColor];
        [aGradient drawInRect:[self bounds] angle:270];
    }
    [super drawRect:dirtyRect];
}
4

1 に答える 1

3

あなたが見ている振る舞いは、ウィンドウがキーステータスを取得または喪失するときに必ずしも再描画されるとは限らないためだと思います。キーになったとき、またはキーを辞めたときに、ウィンドウを強制的に更新してみます。何かのようなもの:

- (void) viewDidMoveToWindow
{
    if( [self window] == nil ) {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    else {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(forceUpdate)
                                                     name:NSWindowDidResignKeyNotification
                                                   object:[self window]];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(forceUpdate)
                                                     name:NSWindowDidBecomeKeyNotification
                                                   object:[self window]];
    }
}

- (void) forceUpdate
{
    [self setNeedsDisplay:YES];
}
于 2012-08-13T08:05:14.360 に答える