2

最好用这两张图来解释。第一张图片显示了一个尚未悬停的 nsbutton,第二张显示了当我将鼠标悬停在它上面时相同的 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 回答