Question

I have a custom UIView which is drawn using its -[drawRect:] method.

The problem is that the anti-aliasing acts very weird as black lines horizontal or vertical lines are drawn very blurry.

If I disable anti-aliasing with CGContextSetAllowsAntialiasing, everything is drawn as expected.

Anti-Aliasing:
alt text http://dustlab.com/stuff/antialias.png

No Anti-Aliasing (which looks like the expected result with AA):
alt text http://dustlab.com/stuff/no_antialias.png

The line width is exactly 1, and all coordinates are integral values.

The same happens if I draw a rectangle using CGContextStrokeRect, but not if I draw exactly the same CGRect with UIRectStroke.

Was it helpful?

Solution

Since a stroke expands equal amounts to both sides, a line of one pixel width must not be placed on an integer coordinate, but at 0.5 pixels offset.

Calculate correct coordinates for stroked lines like this:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f);

BTW: Don't cast your values to int and back to float to get rid of the decimal part. There's a function for this in C called floor.

OTHER TIPS

in your view frames, you probably have float values that are not integers. While the frames are precise enough to do fractions of a pixel (float), you will get blurriness unless you cast to an int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top