2012-01-31 54 views
3

虽然在iOS的UIView中绘制矩形,但我仍然遇到同样的问题:矩形边距将它们的颜色与背景混合在一起。我尝试了几个具有相同结果的矩形绘图方法 - 使用贝塞尔路径,逐行绘制边框,并填充矩形的内部。如何在绘制矩形时避免颜色混合?

视图的框架本身总是正确绘制。每当我需要一个矩形时,我甚至考虑过使用视图,但是这看起来并不是正确的方式来做特别的事情,因为我需要画很多东西。

这是我的问题的一个例子。为了便于比较,我画一个长方形的绿色视图与同尺寸:

CGRect horizontalBar = CGRectMake(2, 2, 10, 6); 

UIView* horizontalBarSubView = [[UIView alloc] initWithFrame:horizontalBar]; 
horizontalBarSubView.backgroundColor = [UIColor greenColor]; 
[self addSubview:horizontalBarSubView]; 
[horizontalBarSubView release]; 

而对于矩形本身:

CGRect horizontalBar = CGRectMake(2, 20, 10, 6); 

UIBezierPath* horizontalBarPath = [UIBezierPath bezierPathWithRect:horizontalBar]; 
[[UIColor greenColor] set]; 
[horizontalBarPath fill]; 

这挥动以下结果(10倍变焦):

10x zoom rectangle test

是什么导致颜色混合?

我该如何避免这种情况?

回答

2

@Almo是正确的,你的问题是反锯齿,但你确定这是实际的代码和值?这不应该反别名,我的测试显示它没有。为了得到你的结果,我必须改变你的结果:

CGRect horizontalBar = CGRectMake(2.5, 20.5, 10, 6); 

填充到分数像素上的路径会给你你看到的效果。另外,在具有奇数宽度的整数像素上抚摸路径将以这种方式消除混叠。 (所有在非Retina显示屏上; Retina略有不同。)

我通常不建议关闭消除锯齿,因为@Almo建议。相反,你只需要确保你的路径绘制或填充整个像素。

这是覆盖在更详细地的iOS 5 Programming Pushing the Limits第6章,第114页。

+0

你说得对,我正在绘制一个视图,该视图已经在两个轴上都设置了半像素。 – rahzark 2012-02-03 10:36:07

2

您是否尝试过使用CGContext进行混淆?

CGContextSetShouldAntialias

看图形上下文设置在这里。

http://www.apeth.com/iOSBook/ch15.html

“当你在一个图形上下文绘制,绘图服从上下文的当前设置。因此,该程序总是配置首先设置上下文的设置,然后绘制。“

你会想要一个没有设置CGContextSetShouldAntialias标志的上下文。

虽然正如评论中所述,这将填充否则将与矩形颜色混合的像素。

+0

这确实工作,尽管矩形最终填充所述融合像素,这使得它们(矩形)厚。 – rahzark 2012-02-03 10:50:13

+0

有趣。谢谢(你的)信息! – Almo 2012-02-03 14:30:51