为什么 SKShapeNode 会撕裂?
Why does SKShapeNode tear?
当用户沿着一条线追踪时,SKShapeNode
路径是从线段(来自底层 'tiles')构建的。实际路径是通过锁定用户之前拖过的线来构建的,并在最近的线上找到最近的点到最新的触摸点,然后像这样构建路径:
var activatedPointPath: UIBezierPath {
let activatedPointPath = UIBezierPath()
// self.state.activatedPoints contains the end point
// of each full line segment the user has traced through
if let firstActivatedPoint = self.state.activatedPoints.first {
activatedPointPath.move(to: firstActivatedPoint)
for activatedPoint in self.state.activatedPoints {
activatedPointPath.addLine(to: activatedPoint)
}
// self.state.endOfLine contains the last point the user
// has touched, which may or may not be at the end of a line
// segment
if let lastPoint = self.state.endOfLine {
activatedPointPath.addLine(to: lastPoint)
}
}
return activatedPointPath
}
然后将其分配给 SKShapeNode 为:
self.lineNode.path = self.activatedPointPath.cgPath
然而,当用户追踪线条时,前面的线段在被绘制到屏幕时会闪烁并缺少三角形,如下所示:
上面的图像来自一个简单的 3x3 瓷砖网格,允许用户追踪一条简单的直线:
这是一个更复杂的示例,其中线条从左下角开始到右上角结束:
是什么导致了这些伪像?
edit 虽然我已经找到 a 解决这个问题的方法,但我仍然欢迎任何解释为什么原始代码没有工作和新代码。
我解决此问题的方法是更改 activatedPointPath
计算变量,以将线段组合在一起构建线条,而不是一次性绘制线条。
新代码如下所示:
var previousPoint = firstActivatedPoint
for activatedPoint in self.state.activatedPoints {
let newSegment = UIBezierPath()
newSegment.move(to: previousPoint)
newSegment.addLine(to: activatedPoint)
activatedPointPath.append(newSegment)
previousPoint = activatedPoint
}
if let lastPoint = self.state.endOfLine {
let newSegment = UIBezierPath()
newSegment.move(to: previousPoint)
newSegment.addLine(to: lastPoint)
activatedPointPath.append(newSegment)
} else {
print("No last point")
}
现在可以生成平滑的线条。
当用户沿着一条线追踪时,SKShapeNode
路径是从线段(来自底层 'tiles')构建的。实际路径是通过锁定用户之前拖过的线来构建的,并在最近的线上找到最近的点到最新的触摸点,然后像这样构建路径:
var activatedPointPath: UIBezierPath {
let activatedPointPath = UIBezierPath()
// self.state.activatedPoints contains the end point
// of each full line segment the user has traced through
if let firstActivatedPoint = self.state.activatedPoints.first {
activatedPointPath.move(to: firstActivatedPoint)
for activatedPoint in self.state.activatedPoints {
activatedPointPath.addLine(to: activatedPoint)
}
// self.state.endOfLine contains the last point the user
// has touched, which may or may not be at the end of a line
// segment
if let lastPoint = self.state.endOfLine {
activatedPointPath.addLine(to: lastPoint)
}
}
return activatedPointPath
}
然后将其分配给 SKShapeNode 为:
self.lineNode.path = self.activatedPointPath.cgPath
然而,当用户追踪线条时,前面的线段在被绘制到屏幕时会闪烁并缺少三角形,如下所示:
上面的图像来自一个简单的 3x3 瓷砖网格,允许用户追踪一条简单的直线:
这是一个更复杂的示例,其中线条从左下角开始到右上角结束:
是什么导致了这些伪像?
edit 虽然我已经找到 a 解决这个问题的方法,但我仍然欢迎任何解释为什么原始代码没有工作和新代码。
我解决此问题的方法是更改 activatedPointPath
计算变量,以将线段组合在一起构建线条,而不是一次性绘制线条。
新代码如下所示:
var previousPoint = firstActivatedPoint
for activatedPoint in self.state.activatedPoints {
let newSegment = UIBezierPath()
newSegment.move(to: previousPoint)
newSegment.addLine(to: activatedPoint)
activatedPointPath.append(newSegment)
previousPoint = activatedPoint
}
if let lastPoint = self.state.endOfLine {
let newSegment = UIBezierPath()
newSegment.move(to: previousPoint)
newSegment.addLine(to: lastPoint)
activatedPointPath.append(newSegment)
} else {
print("No last point")
}
现在可以生成平滑的线条。