将CAShapeLayer添加到子视图

时间:2018-12-27 11:09:20

标签: swift uiview subview cashapelayer

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

这是一个测试项目,我正在使用它,以便在我现有的应用程序中添加新功能。

我尝试在项目的MainStoryBoard中添加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但不会将其添加到其中带有gaugeView.layer.addSubView的UIView容器中时,它会绘制并为圆形动画。 >

Screen dump of the main storyboard

Screen dump once let center = gaugeView.center updated..

1 个答案:

答案 0 :(得分:0)

您需要将center设置为gaugeView center,而不是此处的view.center

override func viewDidLoad() {
    super.viewDidLoad()

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

注意:在使用Autolayout时,viewDidLoad永远不是使用frame中尚未布局的subView的正确位置由autolayout。获得和使用frame的最佳地点是viewDidLayoutSubviews