我试图将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容器中时,它会绘制并为圆形动画。 >
答案 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
。