UIBezierPath bezierPathWithArcCenter未正确居中

时间:2017-09-04 08:26:17

标签: ios objective-c uibezierpath

我有一个视图,我想用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()

我做错了什么?

修改 最奇怪的部分是在全新安装应用程序后正确绘制 - 任何连续启动都会导致它像所附图像一样被绘制。为什么呢?

3 个答案:

答案 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。希望这对某人有帮助。