为什么我的石英弧显示比直线更粗?

时间:2009-05-22 21:21:30

标签: iphone objective-c core-graphics antialiasing

我正在尝试创建一个看起来像UIButtonTypeRoundedRect的自定义UIButton。在我的drawRect:中,我创建了一个路径,第一次调用CGContextMoveToPoint(),然后四次调用CGContextAddArc()。然后我走了一条路。但是,在生成的图像中,四个圆角明显比路径的其余部分厚。

我怀疑这与抗锯齿有关,所以我尝试用CGContextSetShouldAntiAlias()将其关闭,但后来看起来更糟。我也尝试过测试线宽,但弧线总是比直线厚。 Apple的UIButtonTypeRoundedRect看起来非常好,因此必须以某种方式解决。有人有线索吗?

编辑:相关代码:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);

CGContextMoveToPoint(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y);
CGContextAddArc(context, rect.origin.x + rect.size.width - kRoundedRectButtonRadius, rect.origin.y + kRoundedRectButtonRadius, kRoundedRectButtonRadius, 3 * M_PI_2, 0, NO);
CGContextAddArc(context, rect.origin.x + rect.size.width - kRoundedRectButtonRadius, rect.origin.y + rect.size.height - kRoundedRectButtonRadius, kRoundedRectButtonRadius, 0, M_PI_2, NO);
CGContextAddArc(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y + rect.size.height - kRoundedRectButtonRadius, kRoundedRectButtonRadius, M_PI_2, M_PI, NO);
CGContextAddArc(context, rect.origin.x + kRoundedRectButtonRadius, rect.origin.y + kRoundedRectButtonRadius, kRoundedRectButtonRadius, M_PI, 3 * M_PI_2, NO);

CGContextClosePath(context);
CGContextSetLineWidth(context, 1.7);
CGContextStrokePath(context);

1 个答案:

答案 0 :(得分:12)

我在绘制自定义按钮之前遇到过这种情况。您所看到的行为源于cocoa的绘制例程在您要求它们的像素位置周围绘制居中的线条。让我解释一下。

您绘制的直线位于按钮矩形的最边缘。调用绘图例程时,Cocoa可以方便地将剪切区域设置为按钮矩形的精确边界,但是当您要求Cocoa沿边缘绘制一条直线时,正好在剪切之外绘制了一半的直线矩形

您注意到圆角的差异,因为弯曲部分完全落入剪裁矩形内部,因此没有任何部分被剪掉。

现在解决方案:

我们假设您绘制的线条恰好是两个像素的厚度。这意味着在裁剪矩形内绘制一个像素,并在外面绘制一个像素(因此被忽略)。您所要做的就是将线条绘制成靠近矩形中心的一个像素。对于自定义绘图例程,您可能正在使用:

NSRect myBounds = [self bounds];

然后从那里计算你的角点。欧洲工商管理学院,使用:

NSRect myProperBounds = NSInsetRect([self bounds], 1.0, 1.0);

你应该好好去。

相关问题