Swift 禁用摄影机视图生长动画

Swift 禁用摄影机视图生长动画,swift,avcapturesession,Swift,Avcapturesession,目前,我有一个vie控制器,它可以显示一个包含摄像头的视图控制器。但是,每当我转换时,预览层都会有一个动画,因此它会从左上角循环增长以填充屏幕的其余部分。我曾尝试禁用CALayer隐式动画,但没有成功。下面是视图出现时的代码 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) previewLayer?.frame = self.view.frame } override f

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


你的工作分为两个阶段。在
视图中将出现
,您添加预览层时根本不给它任何大小,因此它在零原点处是零大小的层:

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
self.view.layer.addSublayer(previewLayer!)
然后,在以后的
viewDidAppear
中,通过给预览层一个实际帧来增加它:

previewLayer?.frame = self.view.frame
这两个阶段按顺序进行,我们可以看到预览层框架中的变化所导致的跳跃


如果你不想看到跳跃,不要那样做。在可以首先为预览层指定实际帧之前,不要添加预览层。

更改层帧时,会出现隐式动画。您可以使用
CATransaction
禁用动画

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

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

这个答案似乎也是正确的,但上面的答案确实起到了作用。@RaimKhalil你确实说过“我尝试过禁用CALayer隐式动画,但没有成功”。但这正是这个答案所说的。很自然,我没有告诉你这么做,因为你声称做了。此外,你的两阶段代码仍然会涉及跳转。-还要注意的是,您的代码仍然是错误的,因为viewwillbeen可以被多次调用,所以您可以得到许多预览层@马特,你说得对,我确实要求过;我会把你的答案标为最佳答案。要修复多个预览层,我是否应该将所有代码从ViewWillDisplay移到ViewDidLoad?