У меня есть UIView
, где я пытаюсь нарисовать подпись.
Функциональность работает, но проблема в том, что мой рисунок начинается на 5 сантиметров ниже моего курсора, и я не знаю почему.
Вот гифка с моей ошибкой:

Вот мой маленький проект: DrawSignature
Вот мой код для рисования:
struct Line {
let strokeWidth: Float
let color: UIColor
var points: [CGPoint]
}
class Canvas: UIView {
// public function
fileprivate var strokeColor = UIColor.black
fileprivate var strokeWidth: Float = 1
func setStrokeWidth(width: Float) {
self.strokeWidth = width
}
func setStrokeColor(color: UIColor) {
self.strokeColor = color
}
func undo() {
_ = lines.popLast()
setNeedsDisplay()
}
func clear() {
lines.removeAll()
setNeedsDisplay()
}
fileprivate var lines = [Line]()
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
lines.forEach { (line) in
context.setStrokeColor(line.color.cgColor)
context.setLineWidth(CGFloat(line.strokeWidth))
context.setLineCap(.round)
for (i, p) in line.points.enumerated() {
if i == 0 {
context.move(to: p)
} else {
context.addLine(to: p)
}
}
context.strokePath()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
lines.append(Line.init(strokeWidth: strokeWidth, color: strokeColor, points: []))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let point = touches.first?.location(in: nil) else { return }
guard var lastLine = lines.popLast() else { return }
lastLine.points.append(point)
lines.append(lastLine)
setNeedsDisplay()
}
}
А вот мой ViewController:
class ViewController: UIViewController {
// Interface Links
@IBOutlet weak var signatureView: Canvas!
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
signatureView.setStrokeColor(color: .black)
}
func setupViews(){
signatureView.layer.borderWidth = 0.5
signatureView.layer.borderColor = UIColor.black.cgColor
signatureView.layer.cornerRadius = 10
}
@IBAction func clearBtnTapped(_ sender: UIButton) {
signatureView.clear()
}
}