使用 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
更大,或者通过其他方法绘制,例如:
- 添加一个更大的子视图(但它会出现在您的视图顶部,因此您需要使其部分透明)
- 将
CALayer
或 CAShapeLayer
添加到您的视图层(具有相同的警告)
- 设置视图层的
borderWidth
以在内容上方绘制边框
(对于所有这些,您可能会发现还需要将视图的 clipsToBounds
属性 设置为 NO
,如果尚未设置的话。)
我正在自定义 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
更大,或者通过其他方法绘制,例如:
- 添加一个更大的子视图(但它会出现在您的视图顶部,因此您需要使其部分透明)
- 将
CALayer
或CAShapeLayer
添加到您的视图层(具有相同的警告) - 设置视图层的
borderWidth
以在内容上方绘制边框
(对于所有这些,您可能会发现还需要将视图的 clipsToBounds
属性 设置为 NO
,如果尚未设置的话。)