CGContext在水平和垂直线宽方面的差异

时间:2014-02-19 08:03:24

标签: ios iphone retina-display cgcontext

这是我的代码:

CGContextSetShouldAntialias(context, NO);
CGContextSetLineWidth(context, 0.5);

CGPoint hPoints[2];
hPoints[0] = CGPointMake(10, 21.5);
hPoints[1] = CGPointMake(100, 21.5);

CGContextAddLines(context, hPoints, 2);

CGPoint vPoints[2];
vPoints[0] = CGPointMake(10, 21.5);
vPoints[1] = CGPointMake(10, 41.5);

CGContextAddLines(context, vPoints, 2);
CGContextStrokePath(context);

结果如下:

enter image description here

你可以看到垂直线是1px宽度但水平线是拉伸的。我已经尝试了所有可能的值Y - (20,20.5,21,21.5)每次拉伸线。

我在这里阅读了很多帖子,但没有成功,有人可以解释发生了什么,我怎么能在精确1px宽度的视网膜显示器上画水平线?

UPD: 解决了它:

UIView *line = [[UIView alloc] initWithFrame:CGRectMake(10, 20, 100, 0.5)]; 
[line setBackgroundColor:[UIColor greenColor]]; 
[self addSubview:line]; 

1retina px没有任何伸展!

2 个答案:

答案 0 :(得分:1)

试试这个:

CGContextSetShouldAntialias(context, NO);
CGContextSetLineWidth(context, .5);

CGPoint hPoints[2];
hPoints[0] = CGPointMake(10, 22.0);
hPoints[1] = CGPointMake(100, 22.0);

CGContextAddLines(context, hPoints, 2);

CGPoint vPoints[2];
vPoints[0] = CGPointMake(10, 22.0);
vPoints[1] = CGPointMake(10, 42.0);

CGContextAddLines(context, vPoints, 2);
CGContextStrokePath(context);

如果你绘制一条线而一个点是一个分数,那么它将给出一条模糊的线条。希望这有助于.. :))

修改

以下是我想要的link。阅读积分与像素。它描述了你所面临的问题。

答案 1 :(得分:0)

这是因为你的得分是21.5分。

当你使用半个点时,它会尝试将线放在两行像素之间,为此,它会尝试在每一侧放置一半的线(这显然是不可能的),因此它绘制了一条模糊的线条而是在每一边。

只是不要使用半分而且没关系。