【问题标题】:Disable camera view growing animation禁用相机视图增长动画
【发布时间】:2019-04-12 02:28:02
【问题描述】:

目前,我有一个 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:

【问题讨论】:

    标签: swift avcapturesession


    【解决方案1】:

    当你改变图层框架时,会有一个隐式动画。您可以使用CATransaction 禁用动画。

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        previewLayer?.frame = self.view.frame
        CATransaction.commit()
    }
    

    【讨论】:

    • 这个答案似乎也有效,但上面的答案成功了。
    • @RaimKhalil 好吧,您确实说过“我尝试禁用 CALayer 隐式动画,但没有成功”。但这正是这个答案所说的。所以很自然我没有告诉你这样做,因为你声称已经这样做了。此外,您的两阶段代码仍然会涉及跳转。 - 另请注意,您的代码仍然是错误的,因为 viewWillAppear 可以被多次调用,因此您最终会得到许多预览层!
    • @matt,你是对的,我确实要求过;我会将您的答案标记为最佳答案。要修复多个预览层,我应该将所有代码从 ViewWillAppear 移动到 ViewDidLoad 吗?
    【解决方案2】:

    您分两个阶段做事。在viewWillAppear 中,你添加了预览层,根本没有给它任何大小,所以它是零原点的零大小层:

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

    然后,在viewDidAppear 中,您通过给它一个实际的框架来扩展预览层:

    previewLayer?.frame = self.view.frame
    

    这两个阶段是按顺序发生的,我们可以看到预览层的帧变化引起的跳跃。

    如果您不想看到跳跃,请不要这样做。在您可以先将其实际帧赋予它之前,不要添加预览层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2015-03-20
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多