2013-03-01 3 views
2

Это лучше всего объясняется этими двумя картинками. На первом снимке отображается nsbutton, который еще не был виден, второй показывает тот же nsbutton, когда я навис над ним.NSView drawRect, мешающий указателю NSButton

Как вы можете видеть, внешний вид беззерновой линии NSView, по-видимому, также нарисован на кнопке. Кнопка является обычным экземпляром NSButton, без подкласса.

enter image description here

enter image description here

Вот мой заказ 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

Система рисования проходит в прямоугольнике зрения, которая должна быть перерисованы в качестве единственного параметра drawRect: Вы находитесь используя этот прямоугольник безоговорочно для пути, path = [NSBezierPath bezierPathWithRect:rect];, считая, что этот прямоугольник всегда является полным ограничением вида. Это не тот случай. Когда кнопка зависнет, ее кадр - это часть вашего представления, которая была признана недействительной и нуждается в перерисовке, и вот что такое rect.

Вы должны либо проверить rect, чтобы убедиться, что он подходит для использования в пути, либо - проще и точнее, если у вас нет измеримых проблем, связанных с качеством чертежа - всегда используйте границы представления для контура контура ,

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

Контекст рисования будет обрезать чертеж на прямоугольник, который он запросил в любом случае.

+0

Ах, спасибо за объяснение. Если я правильно понял, я мог бы также проверить, соответствует ли рекурсивно тот же размер, что и границы, если это не так, тогда мне вообще не нужно рисовать. (тогда это кнопка, зависающая или что-то еще). – Wesley

+0

Нет, в этом конкретном случае вам нужно перерисовать этот белый фон - кнопка также рисует вне своего овала, но внутри его рамки. –

+0

О да, потому что это прозрачные края. Спасибо за четкое объяснение. – Wesley

Смежные вопросы