NSTextField - Subclassing& drawRect导致文本无法加载

时间:2012-08-06 08:10:36

标签: objective-c macos cocoa

尝试完善NSTextField的边框(左上角的小黑框):http://cl.ly/image/2V2L1u3b3u0G

所以我将NSTextField子类化了:

MYTextField.h

#import <Cocoa/Cocoa.h>
@interface HATrackCounterField : NSTextField
@end

MYTextField.m

#import "HATrackCounterField.h"
@implementation HATrackCounterField
- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {}
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor blackColor] setFill];
    [[NSBezierPath bezierPathWithRoundedRect:dirtyRect xRadius:3.0 yRadius:3.0] fill];
}

@end

现在它没有显示文字字段文字:http://cl.ly/image/1J2W3K431C04

我是Objective-c的新手,看起来这应该很容易,所以我可能只是做错了......

谢谢!

注意:我正在通过集合视图设置文本,并且我在不同点尝试setStringValue:也无济于事。

2 个答案:

答案 0 :(得分:5)

您的文本字段文字未显示,因为您覆盖-drawRect并且未在其中调用[super drawRect:dirtyRect]

在你的情况下,我认为做你想做的最简单的方法是使用剪辑蒙版:让NSTextField执行绘图蚂蚁然后剪辑区域:

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];
    [[NSBezierPath bezierPathWithRoundedRect:dirtyRect xRadius:3.0 yRadius:3.0] setClip];
    [super drawRect:dirtyRect];
    [NSGraphicsContext restoreGraphicsState];
}

一般来说,最好将NSTextFieldCell子类化为自定义绘图,因为单元格负责绘制。

答案 1 :(得分:3)

作为未来读者的参考,这可能是你应该如何做到的,通过继承NSTextFieldCell

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSBezierPath *betterBounds = [NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:CORNER_RADIUS yRadius:CORNER_RADIUS];
    [betterBounds addClip];
    [super drawWithFrame:cellFrame inView:controlView];
    if (self.isBezeled) { // optional, but provides an example of drawing a prettier border
        [betterBounds setLineWidth:2];
        [[NSColor colorWithCalibratedRed:0.510 green:0.643 blue:0.804 alpha:1] setStroke];
        [betterBounds stroke];
    }
}

我在这里画了一个额外的蓝色边框(虽然这对你的黑盒子来说似乎没必要)