UIView的drawRect:方法,能否在路径内进行描边?

7
使用核心图形,能否描边路径的内部?而不是描边路径的外部和内部各一半的线条粗细?
原因是如果视图的一部分在屏幕边缘而另一部分不在,控制描边的可见厚度会更容易。在屏幕边缘的部分被裁剪,而完全在屏幕上的视图边缘看起来更厚(因为描边的两侧都可见)。 enter image description here
2个回答

15

在描边前先将路径剪裁。


谢谢!你能看一下我上面的“答案”并评论一下吗?这种方法不太可行。笔画根本没有绘制出来。"clip to path"是什么意思,是方法名吗? - OWolf
你很接近了。 CGContextClip() 的文档说:“在确定新的剪切路径后,该函数将上下文的当前路径重置为空路径。” 这就解释了为什么 CGContextDraw 不会画任何东西 - 你需要再次将路径添加到上下文中,然后才能描边。 - Kurt Revis
使用 CGPathUIBezierPath 可以使这个过程更容易 -- 你可以创建一次路径,然后使用两次。 - Kurt Revis
不错!简短明了!非常感谢! - the_critic

6
这不会绘制任何描边:
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
    CGContextSetLineWidth(context, 14);
    CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect), CGRectGetHeight(rect));
    CGFloat radius = 30;
    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    CGContextClosePath(context);
    CGContextClip(context);
    CGContextDrawPath(context, kCGPathStroke);
}

编辑:根据正确答案,以下是有效的解决方法:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 14);
    CGRect pathRect = CGRectMake(10, 10, rect.size.width -20, rect.size.height -20);
    CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:pathRect cornerRadius:20].CGPath;
    CGContextAddPath(context, path);
    CGContextClip(context);
    CGContextAddPath(context, path);
    CGContextDrawPath(context, kCGPathEOFillStroke);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接