2

この 2 つの図で説明するとわかりやすいでしょう。最初の画像は、まだホバーされていない nsbutton を示しています。2 番目の画像は、ホバーしたときの同じ nsbutton を示しています。

ご覧のとおり、なんらかの理由で、NSView の外側のベジエ パスもボタンに描画されているようです。ボタンは通常の NSButton インスタンスであり、サブクラスではありません。

ここに画像の説明を入力

ここに画像の説明を入力

ここに私のカスタム NSView があります:

#import "MyView.h"

@implementation MyView
- (void)drawRect:(NSRect)rect
{    
    NSBezierPath *path;

    path = [NSBezierPath bezierPathWithRect:rect];
    [[NSColor redColor] set];
    [path fill];

    rect.size.width -= 10;
    rect.size.height -= 10;
    rect.origin.x += 5;
    rect.origin.y += 5;

    path = [NSBezierPath bezierPathWithRect:rect];
    [[NSColor whiteColor] set];
    [path fill];
}

- (void)awakeFromNib
{
    NSButton *commandButton = [[NSButton alloc] initWithFrame:NSMakeRect(90, 50, 100, 18)];

    [commandButton setButtonType:NSMomentaryPushInButton];
    [commandButton setBordered:YES];
    [commandButton setTitle:@"Test!"];
    [commandButton setFont:[NSFont fontWithName:@"LucidaGrande" size:14.0]];
    [commandButton setBezelStyle:NSInlineBezelStyle];

    [self addSubview:commandButton];
}

@end
4

1 に答える 1

3

描画システムは、再描画が必要なビューの四角形を単一のパラメーターとしてパスに渡します。この四角形が常にビューの完全な境界四角形であると仮定してdrawRect:、その四角形を無条件にパスに使用しています。path = [NSBezierPath bezierPathWithRect:rect];これはそうではありません。ボタンがホバーされているとき、そのフレームはビューの無効化された部分であり、再描画が必要rectです。

rectパスに使用するのが適切であることをテストして確認するか、測定可能な描画関連のパフォーマンスの問題がない限り、より簡単で問題ありませんが、常にビューの境界をアウトライン パスに使用する必要があります。

path = [NSBezierPath bezierPathWithRect:[self bounds]];

とにかく、描画コンテキストは、要求された四角形に描画をクリップします。

于 2013-03-01T20:25:02.400 に答える