在同一图层中绘制线条和虚线

时间:2017-01-31 04:42:29

标签: ios swift

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

如果您想使用单个UIBezierPath获取此类内容,则可以。答案有点长,并且需要一些解释,所以如果你想做的话,我会回答你。

编辑回答

解决方案是一个需要一点点杂乱的代码,但在某些情况下它的效果非常好:

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

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

Line Dash Style

现在我们要做的就是将它应用到我们的道路上。为了更容易解释,我们将举例:

我们想要从第一张图片创建线条。行的路径存储在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()