UIBezierPath имеет только половину хода

Когда я пытаюсь нарисовать фигуру, как показано ниже, со следующими кодами, фигура показывает только половину линии штриха.

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

let shape = SKShapeNode()
            shape.path = createPointerPath().cgPath
            shape.position = CGPoint(x: frame.midX, y: frame.midY)
            shape.fillColor = UIColor(red: 1.0, green: 0.439, blue: 0.678, alpha: 1.0)
            shape.strokeColor = .white
            shape.lineWidth = 2
            addChild(shape)

Создать форму:

func createPointerPath() -> UIBezierPath {

    let pointerPath = UIBezierPath()
    pointerPath.move(to: CGPoint(x:0, y:0))

    pointerPath.addCurve(to: CGPoint(x:0, y:100), controlPoint1: CGPoint(x:-10, y:0), controlPoint2: CGPoint(x:-50, y:100))
    pointerPath.addCurve(to: CGPoint(x:0, y:0), controlPoint1: CGPoint(x:50, y:100), controlPoint2: CGPoint(x:10, y:0))

    pointerPath.stroke()        
    pointerPath.close()
    return pointerPath
}

Если я установлю x равным 10, он покажет еще одну половину линии, но форма не будет закрыта.

    pointerPath.addCurve(to: CGPoint(x:10, y:0), controlPoint1: CGPoint(x:50, y:100), controlPoint2: CGPoint(x:10, y:0))

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

Любое предложение? Спасибо!


person jdleung    schedule 15.03.2017    source источник
comment
Я не могу воспроизвести это только с помощью кода createPointerPath(). Подозреваю, что баг в другом. Как вы рисуете внутреннюю заливку и внешний цвет? Проблема может быть там.   -  person Rob Napier    schedule 15.03.2017
comment
Примечание: обычно не следует вызывать .stroke в середине функции, которая возвращает путь. Это втягивается в текущий контекст, если он есть. Как правило, вы должны позволить вызывающему объекту обработать путь. (На самом деле, возможно, это часть вашей проблемы, если вы добавляете больше к этому пути после его возврата.)   -  person Rob Napier    schedule 15.03.2017
comment
@RobNapier форма добавлена ​​как SKShapeNode, я дополнил коды, пожалуйста, посмотрите еще раз.   -  person jdleung    schedule 15.03.2017
comment
Я бы определенно убрал этот .stroke.   -  person Rob Napier    schedule 15.03.2017
comment
@RobNapier да, предупреждения исчезли, когда .stroke удалили, но он по-прежнему показывает половину хода :(   -  person jdleung    schedule 15.03.2017


Ответы (1)


Это то, что я получил после попытки; надеюсь, это поможет вам

    let v : UIView = UIView.init(frame: CGRect.init(x: 50, y: 50, width: 200, height: 200))
    v.layer.borderWidth = 2.0
    let shape = CAShapeLayer()
    shape.path = createPointerPath().cgPath
    shape.position = CGPoint(x: frame.midX, y: frame.midY)
    shape.fillColor = UIColor(red: 1.0, green: 0.439, blue: 0.678, alpha: 1.0).cgColor
    shape.strokeColor = UIColor.white.cgColor
    shape.lineWidth = 2
    v.layer.addSublayer(shape)
    self.addSubview(v)

Это та же самая функция, которую вы дали:

func createPointerPath() -> UIBezierPath {

    let pointerPath = UIBezierPath()
    pointerPath.move(to: CGPoint(x:0, y:0))

    pointerPath.addCurve(to: CGPoint(x:0, y:100), controlPoint1: CGPoint(x:-10, y:0), controlPoint2: CGPoint(x:-50, y:100))
    pointerPath.addCurve(to: CGPoint(x:0, y:0), controlPoint1: CGPoint(x:50, y:100), controlPoint2: CGPoint(x:10, y:0))

    pointerPath.stroke()
    pointerPath.close()
    return pointerPath
}

Выход:

Вывод вышеуказанного кода

person nikdange_me    schedule 15.03.2017
comment
да, он отлично работает в CAShapeLayer. Я что-то пропустил в SKShapeNode? - person jdleung; 15.03.2017
comment
Могу ли я предложить, что может измениться!! @jdleung Почему SKShapeNode? какую быструю версию вы используете? - person nikdange_me; 15.03.2017
comment
Мне нужно добавить его как SKShapeNode, чтобы его можно было перемещать. и не только одна форма, будет более 10 одинаковых фигур. Я использую Swift 3.0, последнюю версию Xcode. Можете ли вы заставить его работать в SKShapeNode? - person jdleung; 15.03.2017
comment
Наконец, я заставил его работать, изменив x или y на 0,1, но не на 0, как на первой кривой. Это может быть неправильным решением, но оно работает. - person jdleung; 20.03.2017