4

尝试圆整 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:在不同的点上尝试过也无济于事。

4

2 回答 2

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化而不是进行自定义绘图,因为单元格负责绘图。

于 2012-08-06T08:28:25.273 回答
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];
    }
}

我在这里画了一个额外的蓝色边框(尽管这对你的黑匣子来说似乎是不必要的)

于 2012-08-06T17:35:14.250 回答