我只想在线条和虚线内创建折线图。我不知道如何设置能够在同一层中创建这两行的图层(CAShapeLayer)或路径(UIBezierPath)。你能给我任何意见吗?非常感谢你。
答案 0 :(得分:1)
我认为你不能使用标准形状图层。我相信你需要2个独立的形状层。
答案 1 :(得分:0)
您不能使用单个形状图层。您可以使用前面提到的更多图层,或者实现您自己的形状图层类,该类支持多个贝塞尔曲线路径。几个星期之前,我提出了一个自定义形状图层的简单实现(https://stackoverflow.com/a/41137463/6319106)。您可以将其用作适当实施的基础。
答案 2 :(得分:0)
我不确定我是否理解你的问题。您有CAShapeLayer或UIBezierPath,并且您希望能够绘制虚线并使用相同的对象继续行吗?
如果您想使用单个UIBezierPath获取此类内容,则可以。答案有点长,并且需要一些解释,所以如果你想做的话,我会回答你。
解决方案是一个需要一点点杂乱的代码,但在某些情况下它的效果非常好:
现在,'因为我们知道我们可以前进的任何形状的长度,并查看有关Line Dash样式的Apple文档。我是一个懒惰的人,所以我不会从文档中复制/粘贴,我更喜欢快照。 (它更快)
现在我们要做的就是将它应用到我们的道路上。为了更容易解释,我们将举例:
我们想要从第一张图片创建线条。行的路径存储在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()