イメージは千の言葉よりも優れていると思います。
この写真に表示されているのはNSBox
、 のサブクラスNSViewCollection
です。塗りつぶしの色を「選択したメニュー項目の色」に設定したのは、Interface builder です。
なぜそのような色なのですか?
編集:このSO投稿を読んだ後、おそらくsetPatternPhaseを設定する必要があることがわかりました。しかし、どのように/どこで?
イメージは千の言葉よりも優れていると思います。
この写真に表示されているのはNSBox
、 のサブクラスNSViewCollection
です。塗りつぶしの色を「選択したメニュー項目の色」に設定したのは、Interface builder です。
なぜそのような色なのですか?
編集:このSO投稿を読んだ後、おそらくsetPatternPhaseを設定する必要があることがわかりました。しかし、どのように/どこで?
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];
}
「選択されたメニュー項目の色」パターンは、「メニューの高さ」の項目で使用するように設計されており、NSBox がパターンよりも背が高いように見えます。
つまり、私の回答のコードを使用してパターン フェーズの原点をいじることができますが、パターンの高さが NSBox に対して十分でないため、何の役にも立たないと思います。