Как мне программно создать 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
Чтобы добиться такого результата, я нарисовал карандашом один пиксель на экране и записал его содержимое, что показало мне следующие параметры:
▿ 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
Затем я поиграл с этими значениями (для размера, непрозрачности, азимута, силы и высоты) и понял, что ни одно из них, кроме размера и непрозрачности, не имеет значения. Вот почему я установил их как нулевые значения в моем коде.