在视网膜@ 2x显示器上创建3像素宽的UIBezierPath

时间:2014-11-05 08:17:49

标签: uiimage retina-display uibezierpath cgcontextref

我试图在视网膜@ 2x显示屏上创建一个3像素宽的线条。简单的想法是创建一个1.5宽度的线:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(20, 20), NO, 0.0f);
CGContextRef aRef = UIGraphicsGetCurrentContext();
CGContextSetAllowsAntialiasing(aRef, NO);
CGContextSetShouldAntialias(aRef, NO);
UIBezierPath* bezierPath = UIBezierPath.bezierPath;
[bezierPath moveToPoint: CGPointMake(10, 0)];
[bezierPath addLineToPoint: CGPointMake(10, 10)];
bezierPath.lineWidth = 1.5;
[bezierPath stroke];
UIImage * myImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

但最后,我最终在屏幕上显示了4像素的线宽。

问题是,我正在使用iPad 3(所以视网膜@ 2x),当我使用带有预定义系统按钮UIBarButtonSystemItemAdd的UIBarButtonItem时,十字架的两条路径在我的屏幕上宽度为3像素。

2 个答案:

答案 0 :(得分:0)

我怀疑它的b / c你的路径是1.5分,但是从(0,0)开始。由于路径在路径的一侧绘制了一半,而在另一侧绘制了一半,这意味着.75分在路径上方/下方绘制。

表示你的路径来自(在px中):

left:   (-1.5, 0) =>  (-1.5, 10) 
center: (0,0)     =>  (0,10) 
right:  (1.5,0)   =>  (1.5,10)

这意味着每一方将使用2个像素进行渲染。

相反,你可能想要从(.5,0)=>创建一行。 (.5,10),它将路径宽度与屏幕上的像素对齐:

left:   (-1, 0) =>  (-1, 10) 
center: (.5, 0) =>  (.5, 10) 
right:  (2,  0) =>  (2,  10)

答案 1 :(得分:0)

它适用于:

UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(13, 21, 18, 1.5)];