gpt4 book ai didi

ios - 自定义相机 View 预览层 Plus 尺寸手机问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:33:26 33 4
gpt4 key购买 nike

我在 UIViewController 中有一个不占据全屏的自定义相机 View 。在它下面是一个 Collection View ,其中充满了用“X”拍摄的图像的小缩略图,然后允许用户在将保留的图像上传到 firebase 之前删除它们。

这一切在 iPhone 7 大小的屏幕上都非常好用。然而在大尺寸手机上,自定义相机 View 的预览层并没有填满相机所在的整个 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,带有约束以在 View 中为其下方的 Collection View 留出空间。

 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 本身正确地符合较大的手机屏幕。

这是界面生成器中的相关 View

here is the View in question in the interface builder

这似乎是在大尺寸手机上发生的事情

And this is what seems to happen on a plus size phone

最佳答案

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


viewWillAppear() 方法执行时,所有 View Controller 的 subview 都具有您在 Storyboard 中设置的 frame 值。您需要的是使用针对实际设备尺寸重新计算的更新后的 cameraView.frame 值,以正确设置您的 previewLayer.positionpreviewLayer.bounds . viewDidLayoutSubviews() 方法就是为了这个目的而存在的——在它执行时,所有 View 都会根据正在运行的特定设备重新计算实际大小。

viewDidLayoutSubviews() 可以多次调用,这可能会导致创建多个 View /图层实例。在 View Controller 的生命周期中还有另一种方法,它只被自动布局的 subview 调用一次 — viewDidAppear()

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

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com