【问题标题】:Draw lines and dashed lines in the same layer在同一层画线和虚线
【发布时间】:2017-02-01 03:48:40
【问题描述】:

我只想在线条和虚线内创建折线图。我不知道如何设置能够在同一层中创建这两条线的层(CAShapeLayer)或路径(UIBezierPath)。你能给我一些意见吗?非常感谢。

【问题讨论】:

  • 如果您想要一个好的答案,您应该尝试自己解决问题。如果您无法解决,请回来告诉我们您尝试了什么以及为什么没有成功,我们可以帮助您解决问题。
  • 这种实现需要子层参考:raywenderlich.com/2502/…
  • 完全不要使用 CAShapeLayer。如果你这样做了,正如你已经说过的,你将需要其中的许多,你不想那样做。相反,只需使用 UIBezierPath 将图形的所有不同线条绘制到一个视图中。

标签: ios swift


【解决方案1】:

我不确定我是否理解你的问题。您有 CAShapeLayer 或 UIBezierPath 并且您希望能够使用相同的对象绘制虚线并继续线?

如果您想使用单个 UIBezierPath 获得类似的东西,这是可能的。答案有点长,需要一些解释,所以如果这是你想做的,我会回答你。


编辑答案

解决方案是需要一些杂乱的代码,但在某些情况下它工作得很好,所以:

  • 我们将使用 UIBezierPath 来实现该行。
  • 我们还需要一种能够获得贝塞尔曲线长度的方法。为此,存在UIBezierPath-Length 扩展。不幸的是,它是用 Objective-C 编写的,因此,如果您的应用程序没有 Bridging-Header,那么是时候创建一个了。 (如果您需要帮助,请告诉我)

现在,因为我们知道任何形状的长度,我们可以向前移动并查看有关 Line Dash 样式的苹果文档。我是一个懒惰的人,所以我不会从文档中复制/粘贴,我更喜欢快照。 (更快)

现在剩下要做的就是将其应用于我们的路径。为了更容易解释,我们举个例子:

我们想从第一张图片创建线条。线的路径存储在 var graphLine:UIBezierPath 中。我们使用扩展来获取图形线的长度。 假设长度为 40。我假设您将使用百分比。该线必须 50% 继续,其余部分为虚线。所以我们将 40 除以 100。现在对于困难的部分,我们需要创建一个数组,其值将告诉我们的路径如何绘制。

第一个值很简单,我们的结果乘以 50。下一个值可以使用重复指令相加... 最后我们的数组应该是这样的:

[20,2,3,2,3,2,3,2,3]

我知道这种解释不是最好的。怪我的英语。我希望代码会更有帮助。

var graphLine = UIBezierPath() // init your bezier line properly

    let percentValue = graphLine.length() / CGFloat(100)
    var pattern:[CGFloat] = []
    var currentLength:CGFloat = 0 // Use that to keep track of the added values to the pattern
    //add the first line.
    Swift.print(graphLine.length())
    pattern.append(percentValue * 50)
    currentLength = percentValue * 50
    while (currentLength < graphLine.length()) {
        pattern.append(percentValue) // this is the length of gap
        pattern.append(percentValue * 2) // and this is the length of next line
        currentLength += percentValue * 3

    }
    // now we can set the properties for graphLine
    graphLine.lineWidth = 3
    graphLine.setLineDash(pattern, count: pattern.count, phase: 0)
    UIColor.green.set()
    graphLine.stroke()

【讨论】:

  • 和你的图很像。
  • 如上所述,可以使用子层创建像这样的图形。但是我的图表是可滚动的,如果使用这个解决方案,我必须创建很多子层。
  • 感谢您的帮助。我尝试继承 CAShapeLayer 并使用 UIBezierPath 在该层上绘制线条。但我无法按照您的建议设置路径(setLineDash)来创建虚线和线
  • 昨天我测试了上面的代码,它可以工作dl.dropboxusercontent.com/u/75665703/TestDashedLine.zip
  • 由于您使用 UIBezierPath 在视图而不是图层上绘制线,所以它工作正常。我的图表视图包括一些层来显示其他东西。我用其中一个来画线。无论如何,我会尝试在视图上画线。再次感谢您。
【解决方案2】:

我认为您不能使用标准形状图层。我相信你需要 2 个单独的形状层。

【讨论】:

  • 这种实现需要子层
  • 是否可以创建标准形状图层的子类?
  • 应该是,但我之前从未尝试过继承CAShapeLayer。
【解决方案3】:

您不能使用单个形状图层。您可以使用前面提到的更多层,或者实现自己的 shape layer 类,它支持多个贝塞尔路径。几周前,我发布了一个自定义形状图层的简单实现 (https://stackoverflow.com/a/41137463/6319106)。您可以将其用作适当实施的基础。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 2023-01-15
    • 2016-05-08
    • 2021-10-11
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多