iOS - Swift 5 - Увеличение в слое предварительного просмотра портит смещения - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть приложение AVFoundation (iOS, Swift 5), которое создает слой предварительного просмотра типа AVCaptureVideoPreviewLayer при касании. Я пытаюсь приблизиться к месту, где он прослушивается. Однако, когда я пытаюсь масштабировать слой предварительного просмотра, его смещение перемещается в центр экрана.

На очень простом уровне я пытаюсь сделать следующее:

let globalPoint = gestureRecognizer.location(in: gestureRecognizer.view)
// Create a small view where user tapped
let scale:CGFloat = 4   // Zoom scale
let previewWindowSide:CGFloat = 150   // Size of preview window, so a 150x150 square
// Normalize so we don't show something outside the view
let x = min(max(globalPoint.x - previewWindowSide/2, 0), view.frame.maxX - previewWindowSide)
let y = min(max(globalPoint.y - previewWindowSide/2, 0), view.frame.maxY - previewWindowSide)
// Now, create a zoom view that will contain the preview layer. I store it as an instance variable
zoomView = UIView(frame: CGRect(x: x, y: y, width: previewWindowSide, height: previewWindowSide))
zoomView!.clipsToBounds = true
zoomView!.layer.borderWidth = 1
zoomView!.layer.borderColor = UIColor.white.cgColor
zoomView!.contentMode = .scaleAspectFill
view.addSubview(self.zoomView!)

// smallerPreview is also an instance var, of type AVCaptureVideoPreviewLayer
// Till now, everything is fine. Now comes the preview layer. What do I set for its properties?
smallerPreview!.bounds = view.bounds  // As large as the main view
zoomView!.layer.addSublayer(smallerPreview!)
smallerPreview!.videoGravity = .resizeAspectFill

// This is where the incorrectly set offsets for smallerPreview cause misalignment
CATransaction.begin()
CATransaction.setAnimationDuration(0.01)
smallerPreview!.setAffineTransform(CGAffineTransform(scaleX: scale, y: scale))
CATransaction.setCompletionBlock {
    self.smallerCaptureSession!.startRunning()
}
CATransaction.commit()

Код показывает всплывающее окно, правильного размера и в пределах внешнего вида, так что работает нормально. Однако вместо увеличения масштаба до места, где произошло нажатие, увеличение происходит в центре основного вида.

Я попытался установить границы, contentsCenter и несколько дюжин других свойств меньшего просмотра все безрезультатно. Приложение основано на SwiftUI, я не использую раскадровку. Любые манипуляции необходимо выполнить с помощью кода.

Как переместить смещение увеличенного слоя таким образом, чтобы область, отображаемая в слое предварительного просмотра, была местом расположения исходного касания (globalPoint)?

...