Почему рисование в одном виде приводит к повторному центрированию другого вида на экране? - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь написать приложение для рисования, которое позволяет рисовать поверх фотографии.В режиме «настройка фото» пользователь выбирает фотографию, а затем использует жесты для ее панорамирования, сжатия или поворота по желанию.Затем пользователь переходит в режим «рисования», чтобы рисовать линии над фотографией.Он вызывает 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()

[debugging screenshot]

...