【问题标题】: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 更大,或者通过其他方法进行绘制,例如:
- 添加一个更大的子视图(但它会出现在您的视图顶部,因此您需要使其部分透明)
- 将
CALayer 或CAShapeLayer 添加到视图层(同样需要注意)
- 设置视图层的
borderWidth 以在内容顶部绘制边框
(对于所有这些,您可能会发现您还需要将视图的clipsToBounds 属性设置为NO,如果还没有的话。)