使用 bezierPathWithOvalInRect 绘制时边框被剪裁

Border clipped when drawing with bezierPathWithOvalInRect

我正在自定义 UIView 的 drawRect 中画一个圆:

- (void)drawRect:(CGRect)rect {
  ...
  UIBezierPath *ovalPath = [UIBezierPath bezierPathWithOvalInRect:rect];
  [UIColor.whiteColor setStroke];
  ovalPath.lineWidth = 1;
  [ovalPath stroke];
}

椭圆总是在边缘被剪掉。我怎样才能避免剪裁?插入矩形是唯一的方法吗?

CG 以路径为中心绘制笔划——一半在路径内,一半在路径外。因此,部分笔划在您的视野之外,您看不到它。

将矩形插入笔划宽度的一半。

CGRect rectToStroke = CGRectInset(rect, 0.5, 0.5);
UIBezierPath *ovalPath = [UIBezierPath bezierPathWithOvalInRect: rectToStroke];

您使用 CG 或 UIKit 在 -drawRect: 内部绘制的任何内容都会进入位图上下文,该上下文是您视图 bounds 的大小。

如果您需要显示比 bounds.size 更大的内容,您有两个选择:使视图的 bounds 更大,或者通过其他方法绘制,例如:

  1. 添加一个更大的子视图(但它会出现在您的视图顶部,因此您需要使其部分透明)
  2. CALayerCAShapeLayer 添加到您的视图层(具有相同的警告)
  3. 设置视图层的 borderWidth 以在内容上方绘制边框

(对于所有这些,您可能会发现还需要将视图的 clipsToBounds 属性 设置为 NO,如果尚未设置的话。)