当前位置:  开发笔记 > IOS > 正文

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

如何解决《为什么我的石英弧显示比直线更粗?》经验,为你挑选了1个好方法。

我正在尝试创建一个看起来像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);

e.James.. 12

我在绘制自定义按钮之前遇到过这种情况.你所看到的行为源于这样一个事实,即cocoa的绘图例程你要求它们的像素位置为中心绘制线条.让我解释.

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

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

现在为解决方案:

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

NSRect myBounds = [self bounds];

然后从那里计算你的角点.欧洲实验室,使用:

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

你应该好好去.



1> e.James..:

我在绘制自定义按钮之前遇到过这种情况.你所看到的行为源于这样一个事实,即cocoa的绘图例程你要求它们的像素位置为中心绘制线条.让我解释.

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

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

现在为解决方案:

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

NSRect myBounds = [self bounds];

然后从那里计算你的角点.欧洲实验室,使用:

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

你应该好好去.


对于任何感兴趣的人来说,Cocoa的NSInsetRect()的iOS等价物是CGRectInset().
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有