修复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
相关产品推荐
相关产品推荐

