【问题标题】:Stroke of CAShapeLayer stops at wrong point?CAShapeLayer 的行程停在错误的位置?
【发布时间】:2018-12-27 23:52:31
【问题描述】:

我画了一个简单的圆形进度视图,如下所示:

let trackLayer:CAShapeLayer = CAShapeLayer()
let circularPath:UIBezierPath = UIBezierPath(arcCenter: CGPoint(x: progressView.frame.width / 2, y: 39.5), radius: progressView.layer.frame.size.height * 0.4, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)
trackLayer.path = circularPath.cgPath
trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 6
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.lineCap = kCALineCapRound
progressView.layer.insertSublayer(trackLayer, at: 0)
let progressLayer:CAShapeLayer = CAShapeLayer()
progressLayer.path = circularPath.cgPath
progressLayer.strokeColor = UIColor.blue.cgColor
progressLayer.lineWidth = 6
progressLayer.fillColor = UIColor.clear.cgColor
progressLayer.lineCap = kCALineCapSquare
progressLayer.strokeEnd = 0
progressView.layer.insertSublayer(progressLayer, above: trackLayer)

在某个事件上,我尝试更新progressLayer

if let sublayers = progressView.layer.sublayers {
    (sublayers[1] as! CAShapeLayer).strokeEnd = 0.5
}

现在如果我正确理解strokeEnd0 是循环路径的起点,1 是终点,这意味着0.5 应该让它绕到一半,对吗?这就是我得到的:

我测试了多个值,结果发现0.78 绕了一圈。在此之上的任何东西,一直到1,都不会改变任何东西。谁能告诉我我在这里缺少什么。也许我的圆形路径的开始或结束角度有问题?或者也许我完全误解了strokeEnd 的工作原理,在这种情况下,我们将非常感谢您的解释。

【问题讨论】:

    标签: swift uibezierpath cashapelayer


    【解决方案1】:

    谁能告诉我我在这里缺少什么。也许我的圆形路径的开始或结束角度有问题?

    没错。想想你的路径(circularPath),它被指定为形状层的路径。它从startAngle: -CGFloat.pi / 2endAngle: 2 * CGFloat.pi。这更多不仅仅是一个完整的圆圈。你有看到?这是一个四分之一圈!

    这就是为什么在0.78(实际上是0.8 或五分之四)之上,strokeEnd 值的变化似乎没有任何改变;你只是在圆的起点上画,重画你已经画的圆的一部分。

    你可能是说

    startAngle: -.pi / 2.0, endAngle: 3 * .pi / 2.0
    

    (虽然会做的是从0.pi*2并应用旋转变换以便从顶部开始绘图)。


    您的代码的另一个问题是您忘记给任一层添加框架,这可能会导致麻烦。因此它们没有大小。

    【讨论】:

    • 是的,这解决了问题!谢谢!愚蠢的我。当我设置起始角度时,我记得从圆的第一个四分之一开始计算角度,但由于某种原因,我在计算结束角度时完全忘记了这样做。至于图层框架,我设置了父视图的框架 (progressView),我认为这应该足够了,因为所有图层都将被progressView 的框架绑定。设置子层的框架似乎也有点矫枉过正,不是吗?反正不设置图层框架从来没有遇到过什么问题,所以我觉得不会有什么问题。
    • “对于图层框架,我设置了父视图(progressView)的框架,我认为这应该足够了”它不是,你错了。图层不会以某种方式神奇地调整自己的大小。图层的绘图正在出现,但它在没有大小的图层本身之外。零大小的图层让您有一天遇到麻烦(例如,您无法正确应用旋转或缩放变换)。 现在养成在创建图层后立即给它一个frame 的习惯。我不在乎你过去做了什么;返回并修复所有那个代码。 现在就做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2020-01-27
    相关资源
    最近更新 更多