You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复iOS 16双摄设备Camera模式切换警告问题

问题:iOS 16双后置摄像头设备上相机预览单元格触发相机模式警告

我有一个以CameraCell为首个单元格的UICollectionView,用于展示相机预览。在iOS 16系统的iPhone XS Max(双后置摄像头)设备上,XCode控制台出现如下警告:

[Camera] Attempted to change to mode Portrait with an unsupported device (BackDual). Auto device for both positions unsupported, returning Auto device for same position anyway (BackAuto).

该警告在带相机预览的UICollectionViewCell显示到屏幕时触发(并非CameraCell创建阶段)。我尝试子类化UIImagePickerController并阻止方向变更,但未解决问题。以下是我的CameraCell代码:

final class CameraCell: UICollectionViewCell {
    static var reuseIdentifier: String {
        String(describing: CameraCell.self)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        setupView()
        NSLogIfDebug("[CameraCell] Init")
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    deinit {
        NSLogIfDebug("[CameraCell] Deinit")
    }

    private lazy var imagePickerController: UIImagePickerController = {
        let imgPicker = UIImagePickerController()
        imgPicker.delegate = self
        imgPicker.sourceType = .camera
        imgPicker.cameraDevice = .rear
        imgPicker.allowsEditing = false
        imgPicker.showsCameraControls = false
        imgPicker.cameraViewTransform = Constants.cameraViewTransform

        return imgPicker
    }()

    private lazy var cameraContainerView: UIView = {
        let view = UIView(frame: .zero)
        view.clipsToBounds = true
        view.translatesAutoresizingMaskIntoConstraints = false
        view.isUserInteractionEnabled = true

        return view
    }()

    private lazy var cameraView: UIView = {
        // Used to return a dummy view on iPhone Simulator
        let isCameraDeviceAvailable = UIImagePickerController.isCameraDeviceAvailable(UIImagePickerController.CameraDevice.rear)

        guard isCameraDeviceAvailable, let view = imagePickerController.view else {
            let dummyView = UIView(frame: .zero)
            dummyView.translatesAutoresizingMaskIntoConstraints = false
            return dummyView
        }
        
        view.frame = .zero
        view.translatesAutoresizingMaskIntoConstraints = false

        return view
    }()

    private lazy var cameraImageView: UIImageView = {
        let imageView = UIImageView(frame: .zero)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .center
        imageView.clipsToBounds = true
        imageView.image = Constants.cameraImage
        imageView.backgroundColor = .surface8Color.withAlphaComponent(Constants.cameraImageViewAlpha)
        imageView.isUserInteractionEnabled = true

        return imageView
    }()
}

// MARK: - Private

private extension CameraCell {
    enum Constants {
        static let cameraImageViewAlpha = 0.4 as CGFloat
        static let cameraImage = UIImage(named: "photo-camera")
        static let cameraViewTransform = CGAffineTransform(scaleX: 2.0, y: 2.0)
    }

    func setupView() {
        setupCameraContainerView()
    }

    func setupCameraContainerView() {
        addSubview(cameraContainerView)

        addConstraints([
            cameraContainerView.leadingAnchor.constraint(equalTo: leadingAnchor),
            cameraContainerView.trailingAnchor.constraint(equalTo: trailingAnchor),
            cameraContainerView.topAnchor.constraint(equalTo: topAnchor),
            cameraContainerView.bottomAnchor.constraint(equalTo: bottomAnchor)
        ])

        setupCameraView()
        setupCameraImageView()
    }

    func setupCameraView() {
        cameraContainerView.addSubview(cameraView)

        addConstraints([
            cameraView.leadingAnchor.constraint(equalTo: cameraContainerView.leadingAnchor),
            cameraView.trailingAnchor.constraint(equalTo: cameraContainerView.trailingAnchor),
            cameraView.topAnchor.constraint(equalTo: cameraContainerView.topAnchor),
            cameraView.bottomAnchor.constraint(equalTo: cameraContainerView.bottomAnchor)
        ])
    }

    func setupCameraImageView() {
        cameraContainerView.addSubview(cameraImageView)

        addConstraints([
            cameraImageView.leadingAnchor.constraint(equalTo: cameraContainerView.leadingAnchor),
            cameraImageView.trailingAnchor.constraint(equalTo: cameraContainerView.trailingAnchor),
            cameraImageView.topAnchor.constraint(equalTo: cameraContainerView.topAnchor),
            cameraImageView.bottomAnchor.constraint(equalTo: cameraContainerView.bottomAnchor)
        ])
    }
}

// MARK: - UIImagePickerControllerDelegate

extension CameraCell: UIImagePickerControllerDelegate {}

// MARK: - UINavigationControllerDelegate

extension CameraCell: UINavigationControllerDelegate {}

内容的提问来源于stack exchange,提问作者Denis Kutlubaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:05:33