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 に答える