我正在创建一些自定义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];
}
但是一旦你完成编辑它就会覆盖文本,即使光标还在那里?有什么建议?我试过画标题,但它仍然会发生。
感谢您的帮助。
答案:
通过调用super drawInteriorWithFrame:inView我能够阻止奇怪的文本消失问题。
答案 0 :(得分:1)
在我看来,你最终画出了你的超类(NSTextField
')drawRect:
实现的绘图。你还没有打电话给super
,但它仍然设法自己画画。我不确定为什么我自己,但是一些NSControl
例如文本字段和按钮,当被子类化时,无论你是否在它们上面调用drawRect:
,它们都会自我绘制。例如,如果您继承普通NSButton
,实施drawRect:
并且不调用super
,则无论如何都会绘制按钮。可能超过你所画的任何东西,这在过去引起了混乱。最简单的解决方案是不要继承NSTextField
,看看是否还有另一个可以子类化的类(如注释中提到的NSTextFieldCell
)。