Не зная, что CanvasViewController
вы используете, невозможно полностью ответить на ваш вопрос правильно, но я отвечу, если предположить, что он работает аналогично любому обычному UIView в iOS.
Есть несколько вещей, на которые я могу обратить внимание для улучшения производительности:
Прежде всего, не добавляйте одно и то же ShapeLayer
снова и снова внутри drawLineInDrawingView(from:CGPoint,to:CGPoint)
в чертежный вид, вместо этого делайте это только один раз в touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
и сохраняйте ссылку на него.
Во-вторых, ваш drawLineInDrawingView(from:CGPoint,to:CGPoint)
должен выглядеть так:
func drawLineInDrawingView(from:CGPoint,to:CGPoint){
CATransaction.begin()
CATransaction.setDisableActions(true)
drawLine!.move(to: CGPoint(x: from.x, y: from.y))
drawLine!.addLine(to: CGPoint(x: to.x, y: to.y))
shapeLayer!.path = drawLine!.cgPath
shapeLayer!.strokeColor = UIColor.black.cgColor
shapeLayer!.lineCap = .round
shapeLayer!.lineWidth = 100
shapeLayer!.setNeedsDisplay()
CATransaction.commit()
}
Итак, в заключение: при касании Began () вы добавляете shapeLayer и сохраняете ссылку на него. Внутри touchesMoved вы вызываете функцию drawLineInDrawingsFunction.
Ваша функция drawLineInDrawings, только обновляет ваш Shapelayer с shapeLayer.setNeedsDisplay()
.
Помещение вашего преобразования внутри
CATransaction.begin()
CATransaction.setDisableActions(true)
/**Your transformation here**/
CATransaction.commit()
Предназначен только для того, чтобы запретить вашему представлению автоматически анимировать изменения и немедленно показывать их.
Надеюсь, это поможет.