代码之家  ›  专栏  ›  技术社区  ›  eliego

为什么我的石英弧显示得比直线厚?

  •  4
  • eliego  · 技术社区  · 17 年前

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

    我怀疑这与抗锯齿有关,所以我尝试用CGContextSetShouldAntiAlias()将其关闭,但结果看起来更糟。我也尝试过线宽,但圆弧总是比直线粗。苹果的UIButtonyPeroundRect看起来非常好,所以一定有可能以某种方式解决。有人有线索吗?

    编辑:相关代码:

    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 回复  |  直到 16 年前
        1
  •  12
  •   James Eichele Bernard Igiri    17 年前

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

    正在绘制的直线落在按钮矩形的最边缘。调用绘图例程时,Cocoa已方便地将剪裁区域设置为按钮矩形的精确边界,但当要求Cocoa沿边缘绘制线时, 线的一半正好绘制在剪切矩形的外部 .

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

    现在来看解决方案:

    NSRect myBounds = [self bounds];
    

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

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

    推荐文章