我正在尝试创建一个看起来像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);
你应该好好去.
我在绘制自定义按钮之前遇到过这种情况.你所看到的行为源于这样一个事实,即cocoa的绘图例程以你要求它们的像素位置为中心绘制线条.让我解释.
您绘制的直线落在按钮矩形的边缘.调用绘图例程时,Cocoa可以方便地将剪切区域设置为按钮矩形的精确边界,但是当您要求Cocoa沿边缘绘制一条直线时,恰好将一半的线绘制在剪切矩形之外.
您会注意到圆角的差异,因为弯曲部分完全落在剪切矩形内部,因此没有任何部分被剪掉.
现在为解决方案:
假设您绘制的线条恰好是两个像素的厚度.这意味着在裁剪矩形内绘制一个像素,并在外面绘制一个像素(因此被忽略).您所要做的就是将线条绘制成靠近矩形中心的一个像素.对于自定义绘图例程,您可能正在使用:
NSRect myBounds = [self bounds];
然后从那里计算你的角点.欧洲实验室,使用:
NSRect myProperBounds = NSInsetRect([self bounds], 1.0, 1.0);
你应该好好去.