Функция close() UIBezierPath не работает для SKShapeNode

Функция close() должна создавать отрезок между первой и последней точками вложенного пути. Он работает в Playground, но не работает, когда я создаю SKShapeNode с UIBezierPath и использую его для ARSKView. Есть идеи, как это исправить?

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
    let bezierPath = UIBezierPath()
    bezierPath.move(to: CGPoint(x: 40, y: 0))
    let shapeHeight: CGFloat = 40
    bezierPath.addQuadCurve(to: CGPoint(x: 40.0, y: shapeHeight), controlPoint: CGPoint(x: 100.0, y: shapeHeight/2.0))
    bezierPath.close()

    let shape = SKShapeNode(path: bezierPath.cgPath, centered: true)
    shape.isAntialiased = false
    shape.strokeColor = .white
    shape.fillColor = .clear
    shape.lineWidth = 2.0
    return shape
}

введите здесь описание изображения введите здесь описание изображения


person Iraklii    schedule 10.03.2019    source источник
comment
SKShapeNodes имеют проблемы с отрисовкой, когда линия пересекается на пути, вероятно, поэтому вы видите проблему и должны прикрепить дополнительную точку.   -  person Knight0fDragon    schedule 12.03.2019


Ответы (1)


Я не знаю, почему это происходит, но это очень легко исправить:

    bezierPath.move(to: CGPoint(x: 40, y: 0))

    bezierPath.addLine(to:  CGPoint(x: 40.0001, y: 0)) //Add this line

    let shapeHeight: CGFloat = 40
    bezierPath.addQuadCurve(to: CGPoint(x: 40.0, y: shapeHeight), controlPoint: CGPoint(x: 100.0, y: shapeHeight/2.0))
    bezierPath.close()
person E.Coms    schedule 11.03.2019
comment
Такое смешное Apple, такое смешное! Очень странное поведение и очень интересно узнать, почему 40 не работает, а 40.0001 работает. Спасибо! - person Iraklii; 11.03.2019