使用核心图形,能否描边路径的内部?而不是描边路径的外部和内部各一半的线条粗细?
原因是如果视图的一部分在屏幕边缘而另一部分不在,控制描边的可见厚度会更容易。在屏幕边缘的部分被裁剪,而完全在屏幕上的视图边缘看起来更厚(因为描边的两侧都可见)。
原因是如果视图的一部分在屏幕边缘而另一部分不在,控制描边的可见厚度会更容易。在屏幕边缘的部分被裁剪,而完全在屏幕上的视图边缘看起来更厚(因为描边的两侧都可见)。
在描边前先将路径剪裁。
- (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);
}
CGContextClip()
的文档说:“在确定新的剪切路径后,该函数将上下文的当前路径重置为空路径。” 这就解释了为什么CGContextDraw
不会画任何东西 - 你需要再次将路径添加到上下文中,然后才能描边。 - Kurt RevisCGPath
或UIBezierPath
可以使这个过程更容易 -- 你可以创建一次路径,然后使用两次。 - Kurt Revis