我尝试将 CAShapeLayer 添加到主视图(单 View 应用程序)上的较小 UIView 中。我对形状图层进行了动画处理并对触摸手势使用react以开始绘制它。但它是从主视图的中心绘制的,我需要能够移动它并限制它以实现布局目的。我看过另一篇文章,似乎也有同样的问题,但我认为我自己更困惑了。我在主 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 容器中。
最佳答案
您需要设置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
.
关于swift - 将 CAShapeLayer 添加到 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944070/