Swift 将CAShapeLayer添加到子视图

Swift 将CAShapeLayer添加到子视图,swift,uiview,subview,cashapelayer,Swift,Uiview,Subview,Cashapelayer,我试图将CAShapeLayer添加到主视图(单视图应用程序)上较小的UIView中。我将形状层设置为动画,并对触摸手势做出反应,开始绘制它。但它是从主视图的中心绘制的,我需要能够移动它并约束它,以便进行布局。我看到另一篇文章似乎也有同样的问题,但我想我更困惑了自己。我在主ViewController的viewDidLoad函数中有以下代码 这是一个测试项目,我正在玩添加新功能到我现有的应用程序,一旦我有它的工作 我已尝试在项目的主工具栏中添加UIView,并将其链接到ViewControlle

我试图将CAShapeLayer添加到主视图(单视图应用程序)上较小的UIView中。我将形状层设置为动画,并对触摸手势做出反应,开始绘制它。但它是从主视图的中心绘制的,我需要能够移动它并约束它,以便进行布局。我看到另一篇文章似乎也有同样的问题,但我想我更困惑了自己。我在主ViewController的viewDidLoad函数中有以下代码

这是一个测试项目,我正在玩添加新功能到我现有的应用程序,一旦我有它的工作

我已尝试在项目的主工具栏中添加UIView,并将其链接到ViewController.swift文件(控制拖动)以创建插座,然后将shapeLayer和trackLayer添加到UIView

下面的代码

@IBOutlet weak var gaugeView: UIView!


override func viewDidLoad() {
    super.viewDidLoad()

    let centre = view.center

    let circularPath = UIBezierPath(arcCenter: centre, radius: 100, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)

    // Track Layer Under Gauge
    trackLayer.path = circularPath.cgPath
    trackLayer.strokeColor = UIColor.lightGray.cgColor
    trackLayer.lineWidth = 10
    trackLayer.fillColor = UIColor.clear.cgColor
    //view.layer.addSublayer(trackLayer)
    gaugeView.layer.addSublayer(trackLayer)

    // Animated Circular Guage
    shapeLayer.path = circularPath.cgPath
    shapeLayer.strokeColor = UIColor.green.cgColor
    shapeLayer.lineWidth = 10
    shapeLayer.lineCap = .round
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeEnd = 0
    //view.layer.addSublayer(shapeLayer)
    gaugeView.layer.addSublayer(shapeLayer)
  }
一旦我在模拟器中有了应用程序,当view.layer.addSubLayer未注释掉时,它会绘制并设置圆圈动画,但不会将其添加到UIView容器中,gaugeView.layer.addSubView位于其中


您需要将
中心设置为
gaugeView
中心
,而不是此处的
视图。中心

override func viewDidLoad() {
    super.viewDidLoad()

    let centre = CGPoint(x: gaugeView.frame.width/2, y: gaugeView.frame.height/2)
    ...
}

注意:在使用
Autolayout
时,
viewDidLoad
绝不是使用
子视图
框架
的正确位置,该子视图尚未由
Autolayout
布局。获取和使用
框架的最佳位置是
viewDidLayoutSubviews

是否要画一个圆?我已经有一段时间没有使用子层了,但是添加的子层是否可能在框架之外,并且视图具有
clipsToBounds
true?是,它在主视图上工作,但在uiview中不工作。我需要它,我可以在主情节提要中包含它。创建uiview的自定义类,它是圆形视图,并将其放在main.storyboard上,然后只为uiview指定自定义类@MikeyC@AbhishekJadhav好的,这是否也允许我向UIView传递一个变量,以确定正在绘制的圆的属性?ie颜色和圆圈的绘制距离?它将被用作计时器倒计时的进度指示器。刚刚尝试过,请参阅模拟器中的第二个屏幕转储图片。这只是抛出一个错误,因为UIBezierPath需要一个CGpoint和。bounds是一个CGRectYeah。这应该可以解决
let center=CGPoint(x:gaugeView.frame.width/2,y:gaugeView.frame.height/2)
Genius,解决了这个问题。请注意,我在前面的问题中确实试过了,但我想我忘了结尾的/2。非常感谢