Я пытаюсь написать приложение для рисования, которое позволяет рисовать поверх фотографии.В режиме «настройка фото» пользователь выбирает фотографию, а затем использует жесты для ее панорамирования, сжатия или поворота по желанию.Затем пользователь переходит в режим «рисования», чтобы рисовать линии над фотографией.Он вызывает touchesMoved и, в touchesMoved, также вызывает пользовательскую функцию drawLine для рисования.
Вот проблема: во время функции drawLine, базовый вид изображения с фотографией вновь центрируется на экране.Я хочу, чтобы фотография оставалась в своем текущем местоположении и рисовала поверх нее.
Приложение также вызывает функцию touchchesEnded для объединения чертежа из временного чертежного вида в окончательный чертежный вид.Даже если я закомментирую функцию drawLine, фотография будет перецентрироваться во время этой функции.
Я пытался итеративно комментировать различные строки или функции.Если я закомментирую drawLine и коснусь Закругленного, фотография не перецентрируется.Но я, очевидно, также не получаю никакого рисунка.
Так что я также попытался установить точки останова в начале обеих функций и пройти через них.Фотография, кажется, не повторяется, пока находится внутри функции.Скорее, Xcode использует ряд других функций, написанных на каком-то более низком языке, и проходит через их части.Я включил код из файла и снимок экрана с переходом через линию, которая вызвала перецентрирование фотографии.
Мой код адаптирован из учебника Рэя Вендерлиха: https://www.raywenderlich.com/1934-how-to-make-a-simple-drawing-app-with-uikit-and-swift
Я использую Xcode 10.1, Swift 4.2
func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
UIGraphicsBeginImageContext(tempDrawingView.frame.size)
guard let context = UIGraphicsGetCurrentContext() else {
return
}
tempDrawingView.image?.draw(in:tempDrawingView.bounds)
context.move(to: fromPoint)
context.addLine(to: toPoint)
context.setLineCap(.round)
context.setBlendMode(.normal)
context.setLineWidth(brushWidth)
context.setStrokeColor(color.cgColor)
context.strokePath()
tempDrawingView.image = UIGraphicsGetImageFromCurrentImageContext()
tempDrawingView.alpha = opacity
UIGraphicsEndImageContext()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// Merge tempDrawingView into DrawingView
UIGraphicsBeginImageContext(DrawingView.frame.size)
DrawingView.image?.draw(in: DrawingView.bounds, blendMode: .normal, alpha: 1.0)
tempDrawingView?.image?.draw(in: DrawingView.bounds, blendMode: .normal, alpha: opacity)
DrawingView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
lengthLabel.text = String(Int(lineTotal))
tempDrawingView.image = nil
}
Код из файла с именем 0_handleEventQueueInternal, который вызывает повторное центрирование
0x116bb155d <+6862>: movq -0x220(%rbp), %rdi
// Below is the line that causes re-centering
-> 0x116bb1564 <+6869>: callq 0x116ab765c ; _UIApplicationFlushRunLoopCATransactionIfTooLate
0x116bb1569 <+6874>: movl %eax, %ebx
0x116bb156b <+6876>: movq 0xb39096(%rip), %rsi ; "count"
Я ожидаю, что линии будут нарисованы вtempDrawingView в drawLine и затем объединяется с окончательным DrawingView в touchesEnded.И я ожидаю, что эти линии будут располагаться поверх фотографии в ImageView, не вызывая повторного центрирования ImageView на экране.
Вместо этого ImageView перецентрируется при вызове либо функции drawLine, либо функции touchesEnded.
ОБНОВЛЕНИЕ: я итеративно закомментировал строки кода, пока не обнаружил, что проблема возникает при полученииизображение из текущего контекста:
tempDrawingView.image = UIGraphicsGetImageFromCurrentImageContext()
]