Как мне программно создать PKDrawing из CGPoints?

Я смотрел этот сеанс WWDC, а также его образец проекта: https://developer.apple.com/documentation/pencilkit/inspecting_modifying_and_constructing_pencilkit_drawings

Однако, когда я пытаюсь нанести CGPoints на свой холст для рисования, ничего не отображается.

Вот моя установка:

      var points: [CGPoint] = []
(500...1000).forEach { x in
    (500...1000).forEach { y in
        points.append(CGPoint(x: x, y: y))
    }
}
let strokePoints = points.map {
    PKStrokePoint(location: $0, timeOffset: 0, size: CGSize(uniform: 1), opacity: 2, force: 1, azimuth: 1, altitude: 1)
}
let strokePath = PKStrokePath(controlPoints: strokePoints, creationDate: Date())
let stroke = PKStroke(ink: PKInk(.pen, color: .systemGreen), path: strokePath)
canvasView.drawing = PKDrawing(strokes: [ stroke ])

1 ответ

Я понял, что проблема была в размере моего хода. Это будет работать:

      PKStrokePoint(location: point, timeOffset: 0, size: CGSize(uniform: 3), opacity: 1, force: 0, azimuth: 0, altitude: 0)

Обратите внимание, что оно должно быть не меньше 3. Если 1, то оно невидимое, если 2 — полупрозрачное. Похоже, это не связано с масштабом экрана (у моего iPad Pro ), поэтому я просто жестко запрограммировал его на 3, чтобы представить один пиксель.


Чтобы добиться такого результата, я нарисовал карандашом один пиксель на экране и записал его содержимое, что показало мне следующие параметры:

      ▿ PencilKit.PKStrokePoint
  - strokePoint: <PKStrokePoint: 0x600001ad8f60 location={445, 333.5} timeOffset=0.000000 size={3.084399938583374, 3.084399938583374} opacity=0.999985 azimuth=-3.141593 force=0.000000 altitude=1.570796> #0
    - super: NSObject

Затем я поиграл с этими значениями (для размера, непрозрачности, азимута, силы и высоты) и понял, что ни одно из них, кроме размера и непрозрачности, не имеет значения. Вот почему я установил их как нулевые значения в моем коде.

Другие вопросы по тегам