0

我正在创建一些自定义 Cocoa 组件。目前我正在尝试弄清楚如何绘制自定义 NSTextFields。

我已经在我的子类上覆盖了 drawRect 方法,但是当我开始输入时,我得到了一个像http://imgur.com/a/LpUMy这样的双矩形。

这是我的 drawRect 方法

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];
    [[NSBezierPath bezierPathWithRoundedRect:dirtyRect xRadius:5.0f yRadius:5.0f] setClip];
    [[NSColor grayColor] setFill];
    NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
    [NSGraphicsContext restoreGraphicsState];

    [NSGraphicsContext saveGraphicsState];
    NSRect rect = NSInsetRect(dirtyRect, 1.0f, 1.0f);
    [[NSBezierPath bezierPathWithRoundedRect:rect xRadius:5.0f yRadius:5.0f] setClip];
    [[NSColor whiteColor] setFill];
    NSRectFillUsingOperation(rect, NSCompositeSourceOver);
    [NSGraphicsContext restoreGraphicsState];
}

更新:

我将我的绘图代码移动到 NSTextFieldCell 子类中

- (void)drawWithFrame:(NSRect)frame inView:(NSView *)controlView {
    [NSGraphicsContext saveGraphicsState];
    [[NSBezierPath bezierPathWithRoundedRect:frame xRadius:5.0f yRadius:5.0f] setClip];
    [[NSColor grayColor] setFill];
    NSRectFillUsingOperation(frame, NSCompositeSourceOver);
    [NSGraphicsContext restoreGraphicsState];

    [NSGraphicsContext saveGraphicsState];
    [[NSBezierPath bezierPathWithRoundedRect:NSInsetRect(frame, 1.0f, 1.0f) xRadius:3.0f yRadius:3.0f] setClip];
    [[NSColor whiteColor] setFill];
    NSRectFillUsingOperation(frame, NSCompositeSourceOver);
    [NSGraphicsContext restoreGraphicsState];
}

但是一旦你完成编辑它就会在文本上绘制,即使光标仍然存在?有什么建议么?我试过画标题,但它仍然会发生。

谢谢你的帮助。

回答:

NSCell 自定义亮点

通过调用 super drawInteriorWithFrame:inView 我能够阻止奇怪的文本消失问题。

4

1 回答 1

1

在我看来,您最终在超类 ( NSTextField's)drawRect:实现的绘图中绘图。你还没有打电话super,但它仍然设法绘制自己。我自己也不确定为什么,但是有些NSControl像文本字段和按钮,当子类化时,无论你是否调用drawRect:它们,都会绘制自己。例如,如果您将一个 plain 子类化NSButton,实现drawRect:但不调用super,它无论如何都会绘制按钮。可能超过你画的任何东西,这在过去引起了混乱。最简单的解决方案是不子类化NSTextField,看看是否有另一个类可以子类化(就像NSTextFieldCell评论中提到的那样)。

于 2012-11-05T16:48:11.310 回答