我在UIViewController中有一个自定义的相机视图,该视图不会占据全屏。在其下面是一个收集视图,其中填充了带有“X”的小图像缩略图,然后允许用户在将保存的图像上传到Firebase之前将其删除。

在iPhone 7尺寸的屏幕上,所有这些功能都很可爱。但是,在大尺寸电话上,自定义相机视图的预览层不会填充相机所在的整个UIView。

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

    let deviceSession = AVCaptureDeviceDiscoverySession(deviceTypes:
        [.builtInDuoCamera, .builtInTelephotoCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)

    for device in (deviceSession?.devices)! {
        if device.position == AVCaptureDevicePosition.back {
            do {
                let input = try AVCaptureDeviceInput(device: device)

                if captureSession.canAddInput(input) {
                    captureSession.addInput(input)

                    if captureSession.canAddOutput(sessionOutput) {
                        captureSession.addOutput(sessionOutput)

                        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                        previewLayer.connection.videoOrientation = .portrait

                        cameraView.layer.addSublayer(previewLayer)
                        cameraView.addSubview(takePhotoButton)

                        previewLayer.position = CGPoint(x: self.view.frame.width/2, y: self.cameraView.frame.height/2)
                        previewLayer.bounds = cameraView.frame

                        captureSession.startRunning()
                    }
                }
            } catch let avError {
                print(avError)
            }
        }
    }
}

在这里,我将预览层添加为CameraView的子层,CameraView只是在界面构建器中添加的UIView,并受约束以允许在视图中为其下方的集合视图留出空间。
 previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y:   self.cameraView.frame.height/2)
 previewLayer.bounds = cameraView.frame

我不明白为什么添加为子层的预览层在Iphone7上的行为与在Iphone 7 Plus上的行为会有所不同?
特别是因为您可以在Iphone 7 Plus上看到预览层周围的灰色,这表明CameraView被正确地约束,为什么frame.width会有所不同。

看起来在Plus尺寸的手机上,预览层的大小与在常规尺寸的手机上相同,而CameraView本身正确地适应了较大的手机屏幕。

这是界面构建器中有问题的视图

ios - 自定义相机 View 预览层大号电话问题-LMLPHP

这就是大尺寸手机上发生的情况

ios - 自定义相机 View 预览层大号电话问题-LMLPHP

最佳答案

TL; DR:使用viewDidAppear()方法设置视图和图层的坐标和框架。

在执行viewWillAppear()方法时,所有视图控制器的子视图都具有您在情节提要中设置的frame值。您需要使用针对实际设备大小重新计算的更新的cameraView.frame值,以正确设置previewLayer.positionpreviewLayer.boundsviewDidLayoutSubviews()方法仅用于此目的-在执行该方法时,所有视图都会针对正在运行的特定设备应用重新计算实际大小。
viewDidLayoutSubviews()可以多次调用,这可能会导致创建多个视图/图层实例。视图控制器生命周期中还有另一种方法,即自动布局子视图仅调用一次viewDidAppear()

因此,您需要将与previewLayer相关的代码从viewWillAppear()移到viewDidAppear()

关于ios - 自定义相机 View 预览层大号电话问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43240455/

10-12 01:49