ios - 将 UIImagePickerController cameraOverlayView 定位在相机预览的顶部

标签 ios swift uiimagepickercontroller cameraoverlayview

我想向我的 UIImagePickerController 添加一个叠加层,但我只需要它覆盖相机预览,而不是顶部或底部的相机控件。我无法在任何地方找到执行此操作的方法,因为每个设备上的顶部/底部控件高度都不同。我以前在其他应用程序上看到过它。任何指导表示赞赏。

imagePicker.sourceType = .camera
            
let overlay = UIView()
overlay.backgroundColor = UIColor(white: 1, alpha: 0.5)

imagePicker.cameraOverlayView!.addSubview(overlay)
// This is using a UIView extension to constrain my views. It's as simple as it looks.
overlay.anchor(top: imagePicker.cameraOverlayView!.topAnchor, left: imagePicker.cameraOverlayView!.leftAnchor, bottom: imagePicker.cameraOverlayView!.bottomAnchor, right: imagePicker.cameraOverlayView!.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 100, height: 100)
        
self.present(imagePicker, animated: true, completion: nil)

我希望这个半透明的 UIView 只填充红色区域。我可以毫无问题地将框架创建为 3:4,但它不会在 Y 轴上正确定位。 imagePicker.cameraOverlayView!.centerYAnchor 与设备的 centerYAnchor 相同。

UIImagePickerController

最佳答案

也许不是最好的解决方案。使用 View 调试器,您可以检查 View 层次结构。现在将 View 添加到子 camera view port controller

imagePicker = CustomPicker()
imagePicker.sourceType = .camera
present(imagePicker, animated: true, completion: nil)


class CustomPicker: UIImagePickerController {
    let overlay = UIView()
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let camController = children.first?.children.first?.children.first, overlay.superview == nil {
            overlay.backgroundColor = UIColor(white: 1, alpha: 0.5)
            camController.view.addSubview(overlay)
            overlay.addPinConstraints(top: 0, left: 0, bottom: 0, right: 0)
        }
    }
}

extension UIView {
    func addPinConstraints(top: CGFloat? = nil, left: CGFloat? = nil, bottom: CGFloat? = nil, right: CGFloat? = nil) {
        guard let parent = superview else { return }
        translatesAutoresizingMaskIntoConstraints = false
        if let left = left {
            leadingAnchor.constraint(equalTo: parent.leadingAnchor, constant: left).isActive = true
        }
        if let right = right {
            trailingAnchor.constraint(equalTo: parent.trailingAnchor, constant: -right).isActive = true
        }
        if let top = top {
            topAnchor.constraint(equalTo: parent.topAnchor, constant: top).isActive = true
        }
        if let bottom = bottom {
            bottomAnchor.constraint(equalTo: parent.bottomAnchor, constant: -bottom).isActive = true
        }
    }
}

View 检查器的屏幕截图, 这里的 child -> child -> child 是相机视口(viewport) enter image description here

关于ios - 将 UIImagePickerController cameraOverlayView 定位在相机预览的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69858926/

相关文章:

ios - 使用已弃用的框架进行开发

ios - 如何在 Swift 中缩放卡片时翻转卡片

uiimageview - 从 'UIImageView*' 分配给 'UIImage*' 的不兼容指针类型

ios - SpriteKit 标签渲染顺序

ios - 具有 2 个以上 channel 的 AVAssetWriterInput

swift - 如何在函数中使用公式词典中的公式

ios - UIImagePickerController 不请求权限?

iphone - UIImagePickerController 自定义叠加和点击聚焦

ios - Swift - 为什么我的函数内的函数没有被调用?

ios - Swift:使用闭包的枚举?