Отключить растущую анимацию просмотра камеры - PullRequest
3 голосов
/ 12 апреля 2019

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

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    previewLayer?.frame = self.view.frame
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    capturedImageView.center = self.view.center
    captureSession = AVCaptureSession()
    if usingFrontCamera == true {
    captureSession?.sessionPreset = AVCaptureSession.Preset.hd1920x1080
    }
    else {
    captureSession?.sessionPreset = AVCaptureSession.Preset.hd1280x720
    }

    captureDevice = AVCaptureDevice.default(for: AVMediaType.video)


    do {
        let input = try AVCaptureDeviceInput(device: captureDevice!)

        if (captureSession?.canAddInput(input) != nil) {
            captureSession?.addInput(input)

            stillImageOutput = AVCapturePhotoOutput()

            captureSession?.addOutput(stillImageOutput!)
            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
            previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
            self.view.layer.addSublayer(previewLayer!)
            captureSession?.startRunning()


        }


    } catch {

    }
}

Есть ли способ удалить эту растущую анимацию? Вот гиф проблемы:

GIF of animation

Ответы [ 2 ]

4 голосов
/ 12 апреля 2019

Вы делаете вещи в два этапа.В viewWillAppear вы добавляете слой предварительного просмотра, не задавая ему вообще никакого размера, так что это слой нулевого размера с нулевым началом:

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
self.view.layer.addSublayer(previewLayer!)

Затем, в viewDidAppear, вы увеличиваетеслой предварительного просмотра, задав ему фактический кадр:

previewLayer?.frame = self.view.frame

Два этапа происходят в этом порядке, и мы можем видеть скачок, вызванный изменением в кадре слоя предварительного просмотра.

Если вы не хотите видеть прыжок, не делайте этого.Не добавляйте слой предварительного просмотра, пока не дадите ему его фактический кадр.

3 голосов
/ 12 апреля 2019

Когда вы меняете кадр слоя, появляется неявная анимация. Вы можете использовать CATransaction для отключения анимации.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    CATransaction.begin()
    CATransaction.setDisableActions(true)
    previewLayer?.frame = self.view.frame
    CATransaction.commit()
}
...