我有UIView
并且在其中我通过覆盖drawRect
使用Core Graphics绘制了一条线。此视图还包含一个也绘制一条线的子视图。但是,虽然两个视图都使用几乎相同的代码(至少用于测试目的),但它们上绘制的线条看起来并不相同:
正如您所看到的 - 顶部的虚线明显比底部的粗线,我不明白为什么。以下是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);
答案 0 :(得分:6)
如果你的rect不是整数,那么它可能是抗锯齿的结果。您可以使用CGContextSetShouldAntialias( context, NO )
禁用抗锯齿功能。我认为还有一个用于制作矩形积分的函数,但我不记得它是什么。
答案 1 :(得分:-2)
首先,您应该解决绘图代码为WET *的问题。你说你出于“测试目的”这样做,但这实际上使测试更难,因为你必须改变两段代码和/或保持你正在使用的版本。最糟糕的情况是,您以不同的方式更改两段代码,并且必须手动合并它们。
我会说将虚线代码移到子视图中,为两段代码需要做的事情添加不同的属性,并创建两个子视图(而不是drawRect:
- 认真)。
至于实际问题:嗯,我看不到一个大图像,我看到一个很小的图像,我只能猜测上线比下线更大胆意味着上线更浓。
顺便说一下,rect
不一定是你图像的界限。不要以为它是,或者你会得到时髦的绘画,当它不是。假设它是界限的一部分 - 可能,但可能不是,整个事物。当您的意思是[self bounds]
时,请说[self bounds]
。
问题很可能是CGRectGetMidY([self bounds])
和CGRectGetMaxY([self bounds])
之间的差异。一个包括分割像素的分数,而另一个分数是一个像素的倍数或接近它。 (不一定是Retina显示屏上1-的倍数,1 pt = 2像素,因此1像素= 0.5 pt。)尝试将这两个数字放在地板上,并可选择添加0.5,并查看您更喜欢哪种方式。
没有办法让它以0.6磅的线宽完美地工作。根本没有完整的像素数。你所能做的就是找出最好看的东西。
*写在别处,与DRY相反。