Я создал объект Camera, который прикрепляю к CameraViewController. Внутри объекта Camera есть следующий метод, который устанавливает AVCaptureVideoPreviewLayer
на данном контроллере вида.
func displayPreview(on view: UIView) throws {
guard let captureSession = self.captureSession, captureSession.isRunning else {
throw CameraControllerError.captureSessionIsMissing
}
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.insertSublayer(self.previewLayer!, at: 0)
previewLayer?.frame = view.bounds
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
previewLayer?.connection?.videoOrientation = .portrait
previewLayer?.masksToBounds = true
}
В CameraViewController, чтобы установить объект камеры, я делаю следующее
var camera = Camera()
override func viewDidLoad() {
super.viewDidLoad()
configureView()
}
override func viewWillLayoutSubviews() {
try? self.camera.displayPreview(on: self.view)
}
private func configureView(){
self.view.addTapGestureRecognizer(action: {
if let parentView = self.parent?.view.frame{
UIView.animate(withDuration: 0.4, animations: {
self.view.layer.cornerRadius = 0
self.view.layer.masksToBounds = true
self.view.layer.borderWidth = 0
self.view.frame = parentView
}, completion: nil)
}
})
}
Все это работает хорошо, с точки зрения изменения размера. Когда это происходит, похоже, что камера создает 2 вида, как на картинке, старый вид сверху и обновленный размер одного вида. Не только это, но и когда размер представления изменяется, это выглядит так, как только PreviewLayer перезагружается перед изменением размера (требуется некоторое время, прежде чем появится увеличенное представление). То, чего я пытаюсь добиться, - это непрерывный анимированный предварительный просмотр с изменением размера камеры. Что мне нужно изменить в моем коде? Я играл с размещением try? self.camera.displayPreview(on: self.view)
в разных частях представления нагрузки, но это ничего не изменило.