Reputation: 137
I'm trying to create a label programmatically using NSTextField, but it comes out blurry: screenshot
This is my code so far:
NSTextfield *textfield = [[NSTextField alloc] initWithFrame:NSMakeRect(5,5,150,20)];
[texField setStringValue:@"some text here"];
[textField setEditable:NO];
[textField setSelectable:NO];
[textField setBordered:NO]
[textField setDrawsBackground:NO]
I've traced the problem down to the setDrawsBackground line. I've also tried using [textField setBackgroundColor:[NSColor clearColor] as well, but no luck.
By the way, I've adding to a textField to the subview of a view that is a subview of a scrollview. I've also playing with isOpaque on all the view levels, but no luck there again.
Any help is greatly appreciated.
Upvotes: 6
Views: 3185
Reputation: 125
Simply, add
CanDrawConcurrently = true
property from InterfaceBuilder
Upvotes: 0
Reputation: 1565
Out of the box, but worth to mention. I have wasted by entire day debugging the issue. I am using a non-apple external monitor and this is where the issue is identified. Once i open the app in Mac book pro, it is perfectly fine. So, the Samsung monitor which i am using might be non-retina.
Upvotes: 0
Reputation: 99
Try this below:
textField.drawsBackground = true
textField.backgroundColor = NSColor.white.withAlphaComponent(.leastNormalMagnitude)
Upvotes: 0
Reputation: 61
I had the same problem, but I have solved it by:
textfield.canDrawSubviewsIntoLayer = true
Upvotes: 6
Reputation: 1418
Make sure you're setting the frame of your NSTextField
to something with all integer values.
Use roundf()
if necessary.
I was getting a blurry NSTextField
, and neither adding a solid background nor removing Core Animation layers from my view hierarchy were options for me. I noticed I was setting the frame of this text field to something with a Y value of 4.5, so the following changes fixed the issue for me:
Blurry label:
_label.frame = NSOffsetRect(_labelFrame,
-0.5 * (someRect.size.width + someConstant),
0.0);
No blur:
_label.frame = NSOffsetRect(_labelFrame,
roundf(-0.5 * (someRect.size.width + someConstant)),
0.0);
(In the above examples, _labelFrame
and someRect
are NSRect
s, and someConstant
is a CGFloat
. As you can see, the calculation I was doing in the second line of the first example was passing a non-integer value to NSOffsetRect
).
Upvotes: 2
Reputation: 1
If you created it via an XIB and it is blurry, I found the fix:
[textField setStringValue:@""];
If I comment this out it goes blurry; if put back it's crystal clear.
Upvotes: 0
Reputation: 137
Since this was my first time subclassing NSView, I had put the above code in the drawRect method instead of the initWithFrame method. I did this because I was following one of the sample applications from Apple's Dev site.
This was also causing my CPU usage to spike when I was scrolling
Upvotes: 1
Reputation: 61228
If you have no background (including clear) and your text is a subview of any layer-backed superview (you've turned on "wants layer" in code or in IB to allow animations/transitions), you'll get blurry text. You have to choose either no layer backed view or a label with a solid background color.
Upvotes: 9