我有一个视图,我想用UIBezierPath bezierPathWithArcCenter
绘制一个圆圈。我的观点initWithFrame
如下:
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self == nil) {
return nil;
}
self.circleLayer = [CAShapeLayer layer];
self.circleLayer.fillColor = UIColor.clearColor.CGColor;
self.circleLayer.strokeColor = UIColor.blackColor.CGColor;
self.circleLayer.lineWidth = 4;
self.circleLayer.bounds = self.bounds;
self.startAngle = 0.0;
self.endAngle = M_PI * 2;
CGPoint center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
CGFloat radius = self.frame.size.height * 0.45;
self.circleLayer.path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:self.startAngle endAngle:self.endAngle clockwise:YES].CGPath;
[self.layer addSublayer:self.circleLayer];
self.backgroundColor = UIColor.greenColor;
return self;
}
我预计会产生一个以我的视角为中心的黑色圆圈。但是,实际输出如下:
commonPool()
我做错了什么?
修改 最奇怪的部分是在全新安装应用程序后正确绘制 - 任何连续启动都会导致它像所附图像一样被绘制。为什么呢?
答案 0 :(得分:1)
这个原因似乎是iOS中的一个错误。 CAShapeLayer
正确设置了边界
self.circleLayer.bounds = self.bounds;
检查后,图层的来源和大小都很好,但只有在安装后首次启动应用后才会。随后启动应用程序将导致其大小为(0, 0)
。删除应用并再次安装将导致正确地绘制圆圈一次。
我通过在路上再次设置图层框架来修复它。
答案 1 :(得分:1)
请勿使用视图的中心!
就我而言,使用
page-y.html
以中心点解决了我的问题。
答案 2 :(得分:0)
我遇到了同样的问题,但对我来说,即使在第一次发射时,路径也没有占据我的视线中心。
这是我出问题时的代码: 让CircularPath = UIBezierPath(arcCenter:CGPoint(x:containerView.frame.size.width / 2,y:containerView.frame.size.height / 2),半径:50,startAngle:(-CGFloat.pi / 2),endAngle :(CGFloat.pi * 2),顺时针:正确)
“ containerView”是包含bazierpath绘制的圆的视图。
但是后来我直觉地完成了以下工作,
let centerPoint = CGPoint(x:containerView.frame.size.width / 2,y:containerView.frame.size.height / 2)
let CircularPath = UIBezierPath(arcCenter:centerPoint,radius:50,startAngle:(-CGFloat.pi / 2),endAngle:(CGFloat.pi * 2),顺时针:true)
基本上,我必须先创建中心点,然后再将其分配给bazierpath。希望这对某人有帮助。