UIBezierPath bezierPathWithArcCenter不正确居中

问题描述 投票:3回答:3

我有我想要绘制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;
}

我预计这将产生在我看来为中心的黑圈。然而,实际的输出如下所示: Actual output

我究竟做错了什么?

编辑怪异的部分是,它绘制正确后重新安装应用程序的 - 任何连续发射导致它被绘制像附着在图像中。为什么?

ios objective-c uibezierpath
3个回答
1
投票

这样做的原因似乎是iOS中的错误。该CAShapeLayer有其界限设置不当

self.circleLayer.bounds = self.bounds;

经检查它,该层的起源和大小是好的,但只有在安装后第一次推出的应用程序后。任何后续推出的应用程序将导致它的大小存在(0, 0)。删除应用程序,并重新安装它会导致循环正在制定适当的一次。

我再次进一步设置层的帧的道路修好了。


1
投票

不要使用视图的中心!

在我的情况下,使用,

let centerPoint = CGPoint(x: bounds.midX, y: bounds.midY)

为中心点解决我的问题。


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绘制的圆的图。

但后来我做了一个预感以下和它的工作。

让中心点= CGPoint(X:containerView.frame.size.width / 2,Y:containerView.frame.size.height / 2)

让circularPath = UIBezierPath(arcCenter:中心点,半径:50,由startAngle:(-CGFloat.pi / 2),endAngle:(CGFloat.pi * 2),顺时针:真)

基本上,我不得不把它分配给bazierpath之前创建的中心点。希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.