使用bezierPathWithOvalInRect绘制时边框被剪裁

时间:2016-01-31 01:37:09

标签: ios objective-c uikit drawrect uibezierpath

我在我的自定义UIView的drawRect中绘制了一个圆圈:

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

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

1 个答案:

答案 0 :(得分:5)

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以在内容之上绘制边框
  4. (对于所有这些,您可能会发现您还需要将视图的clipsToBounds属性设置为NO,如果它还没有。)