放置NSTextField绘图代码的适当位置?

时间:2012-11-05 16:06:26

标签: objective-c cocoa user-interface

我正在创建一些自定义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 Custom Highlight

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

1 个答案:

答案 0 :(得分:1)

在我看来,你最终画出了你的超类(NSTextField')drawRect:实现的绘图。你还没有打电话给super,但它仍然设法自己画画。我不确定为什么我自己,但是一些NSControl例如文本字段和按钮,当被子类化时,无论你是否在它们上面调用drawRect:,它们都会自我绘制。例如,如果您继承普通NSButton,实施drawRect:并且不调用super,则无论如何都会绘制按钮。可能超过你所画的任何东西,这在过去引起了混乱。最简单的解决方案是不要继承NSTextField,看看是否还有另一个可以子类化的类(如注释中提到的NSTextFieldCell)。