2010-11-19 49 views
8

我有一个UIView并在其中我已经绘制了使用核心图形通过覆盖drawRect。这个视图还包含一个子视图,它也绘制了一条线。然而,尽管这两种观点都使用几乎相同的代码(用于测试至少),他们绘制的线条不会出现相同的:iPhone核心图形为子视图较粗的虚线

Image problem

正如你所看到的 - 在虚线顶部明显比底部厚,我不知道为什么。以下是两个UIViews在其drawRect方法中使用的代码。如果您有任何想法,为什么发生这种情况,那么我会感谢您的帮助和建议!

首先查看:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect)); 

CGContextStrokePath(context); 

SubUIView *view = [[SubUIView alloc] initWithFrame:rect]; 
[self addSubview:view]; 
[view release]; 

的观点肯定是只被抽一次。我赞赏drawRect可能不是添加子视图的最佳位置,但问题依然存在,即使在主要的initWithFrame方法中添加了该问题。

第二个视图:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMidY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMidY(rect)); 

CGContextStrokePath(context); 
+1

为什么要在第一个视图的'drawRect:'中添加子视图? – jer 2010-11-19 22:34:57

+0

@jer:这一定很重要吗?我可以从另一个方法如'initWithFrame'添加子视图,但是线宽仍然存在差异。除非我不打算将子视图添加到本身“绘制”并因此出现问题(?)的视图上,但我没有在任何地方读过......但是。 – JoeR 2010-11-19 22:41:24

+1

@JoeR,是的,它可能很重要 - 每次您的视图自己绘制时都会添加子视图,因此您可以通过放置多个相同的子视图来结束视觉效果 - 这可能会导致子视图线变得更粗,因为它们被绘制多次 – Vladimir 2010-11-19 22:44:12

回答

6

这可能是抗锯齿的结果,如果你的矩形不落在整数。您可以使用CGContextSetShouldAntialias(context, NO)禁用消除锯齿功能。我认为还有一个让矩阵积分的函数,但我不记得它是什么。

+0

谢谢!这固定它!我想通过调用'CGContextSetStrokeColorWithColor'指定的这两行都不是固定的白色这一事实应该是一些反锯齿正在发生的线索。我很想知道为什么这发生在子视图中,而不是在主视图中,但现在我只是感谢它的工作! – JoeR 2010-11-19 23:05:27

+3

这是CGRectIntegral() – nielsbot 2011-05-05 06:59:50

-2

首先,您应该修复绘图代码为WET *的问题。你说你这样做是为了“测试目的”,但这实际上使得测试变得更加困难,因为你必须改变这两个代码段和/或保持你正在使用的版本的直接性。最糟糕的情况是,当你以不同的方式更改这两个代码段并且必须手工合并它们时。

我想说的是将虚线代码移到子视图中,为两段代码需要做的改变添加属性,并创建两个子视图(而不是在drawRect:中)。

至于实际的问题:好吧,我没有看到一个大的图像,我看到一个小图像,我只能猜测,上线的更大的胆量比下线的更大的意味着上线更粗。

顺便说一句,rect不一定是图像的边界。千万不要假定它是,或者当它不是时,你会得到时髦的绘画。假设它有一些界限 - 可能,但可能不是,整个事情。当你的意思是[self bounds],说[self bounds]

问题很可能是CGRectGetMidY([self bounds])CGRectGetMaxY([self bounds])之间的差异。一个包含一个分割一个像素的分数,而另一个分数是一个像素的倍数或接近它。 (不一定是视网膜显示器1的倍数,1 pt = 2像素,因此1像素= 0.5 pt。)尝试铺设两个数字并选择性地添加0.5,并查看您更喜欢哪种方式。

没有办法让它在0.6 pt的线条宽度下完美工作。没有完整的像素数量。你所能做的就是制定出看起来最好的方案并做到这一点。

*写在其他地方太干,相反。

+0

感谢您的输入。我写这个问题的时候,我把这个大的形象换成了一个小小的人,好像做了这个工作。 http://i.imgur.com/KalTm.png - 如果有帮助。无论如何,我遇到的问题与我使用的点大小有关,我已将它提升到1.0,但即使在这种情况下也会出现同样的问题。按照公认的答案,关闭反锯齿技术就可以实现这一功能。 – JoeR 2010-11-19 23:56:53