【问题标题】:UIBezierPath bezierPathWithArcCenter not properly centeredUIBezierPath bezierPathWithArcCenter 未正确居中
【发布时间】:2017-09-04 08:26:17
【问题描述】:

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

我预计这会在我的视野中心产生一个黑色圆圈。但是,实际输出如下所示:

我做错了什么?

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

【问题讨论】:

  • 尝试在drawRect方法中使用这段代码
  • self.circleLayer.frame = self.bounds;?
  • @Larme 好吧,它是一个子层,所以它需要有(0, 0) 来源。还是我错了?
  • @MikeAlter 我不能在drawRect 中使用,因为稍后我想在CABasicAnimation 中对其进行动画处理。为什么它显示不正确?我将UIBezierPath 添加到CAShapeLayer 是为了不必在drawRect 中使用它
  • 您正在使用“self.frame.size.width”来定义您的圆心。尝试记录这个。此时您无法确定它的大小。您的视图可以使用 (0,0) 进行初始化,然后根据我们所知调整其大小。

标签: ios objective-c uibezierpath


【解决方案1】:

不要使用视图的中心!

就我而言,使用 ,

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

中心点解决了我的问题。

【讨论】:

    【解决方案2】:

    原因似乎是 iOS 中的一个错误。 CAShapeLayer 的边界设置正确

    self.circleLayer.bounds = self.bounds;
    

    经过检查,图层的来源和大小都很好,但只有在安装后首次启动应用程序后。该应用程序的任何后续启动都将导致其大小为(0, 0)。删除应用并重新安装将导致圆圈正确绘制一次

    我通过在更远的地方再次设置图层的框架来修复它。

    【讨论】:

    • 您是否尝试在viewDidLayoutSubviews 内设置圆形图层的框架?
    【解决方案3】:

    我遇到了同样的问题,但对我来说,即使在第一次启动时,路径也没有在我的视野中心绘制。

    这是我出现问题时的代码: let circularPath = UIBezierPath(arcCenter: CGPoint(x: containerView.frame.size.width/2, y: containerView.frame.size.height/2), radius: 50, startAngle: (-CGFloat.pi / 2), endAngle : (CGFloat.pi * 2), 顺时针: true)

    “containerView”是包含由 bazierpath 绘制的圆圈的视图。

    但后来我凭直觉做了以下工作。

    让 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。希望这可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2020-10-31
      • 2016-05-25
      相关资源
      最近更新 更多