【问题标题】:Border clipped when drawing with bezierPathWithOvalInRect使用 bezierPathWithOvalInRect 绘制时边框被剪裁
【发布时间】:2023-04-10 02:46:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios objective-c uikit drawrect uibezierpath


    【解决方案1】:

    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,如果还没有的话。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多