I am working on creating some custom Cocoa components. Currently I’m trying to figure out how to draw custom NSTextFields.
I have overridden the drawRect method on my subclass but when i start typing, i get a double rectangle like this https://i.stack.imgur.com/5FSYA.jpg.
Here is my drawRect method
- (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];
}
UPDATE:
I moved my drawing code into a NSTextFieldCell subclass as so
- (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];
}
But as soon as you are done editing it draws over the text, even though the cursor is still there? Any suggestions? I’ve tried drawing the title but it still happens.
Thanks for your help.
Answer:
By calling super drawInteriorWithFrame:inView I was able to stop the weird text disappearing issues.
It looks to me like you’ve ended up drawing inside the drawing of your superclass’s (
NSTextField‘s)drawRect:implementation. You haven’t calledsuperbut it still manages to draw itself. I’m not sure why myself, but someNSControls such as text fields and buttons, when subclassed, will draw themselves regardless of whether or not you calldrawRect:on them. For example, if you subclass a plainNSButton, implementdrawRect:and don’t callsuper, it’ll draw the button anyways. Potentially over whatever you drew, which has caused confusion in the past. The easiest solution is to not subclassNSTextField, and see if there’s another class you can subclass (likeNSTextFieldCellmentioned in the comment).