2

イメージは千の言葉よりも優れていると思います。

ここに画像の説明を入力

この写真に表示されているのはNSBox、 のサブクラスNSViewCollectionです。塗りつぶしの色を「選択したメニュー項目の色」に設定したのは、Interface builder です。

なぜそのような色なのですか?

編集:このSO投稿を読んだ後、おそらくsetPatternPhaseを設定する必要があることがわかりました。しかし、どのように/どこで?

4

2 に答える 2

1

Smilin Brianのソリューションに触発されて、私はこれを思いつきました:

-(void) drawRect: (NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    if(mouseOver) {
        [NSGraphicsContext saveGraphicsState];

        CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]);
        CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]);
        [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)];

        [[NSColor selectedMenuItemColor ] setFill];
        NSRectFill(dirtyRect);
        [NSGraphicsContext restoreGraphicsState];
    }
}

現時点では、選択ではなく mouseOver イベントを処理するだけですが、ほとんど同じです。

私が使用したNSBoxのためにそれを必要とする人のために:

- (void)awakeFromNib{
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
                                                                options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow )
                                                                  owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void)mouseEntered:(NSEvent *)theEvent {
    mouseOver = true;
    [self setNeedsDisplayInRect:self.bounds];
    [self needsDisplay];
}

- (void)mouseExited:(NSEvent *)theEvent {
    mouseOver= false;
    [self setNeedsDisplayInRect:self.bounds];

    [self needsDisplay];
}
于 2013-01-23T23:46:08.943 に答える
1

「選択されたメニュー項目の色」パターンは、「メニューの高さ」の項目で使用するように設計されており、NSBox がパターンよりも背が高いように見えます。

つまり、私の回答のコードを使用してパターン フェーズの原点をいじることができますが、パターンの高さが NSBox に対して十分でないため、何の役にも立たないと思います。

于 2013-01-23T22:57:41.057 に答える