我有一个UICollectionView
with a CameraCell
作为第一个单元格,它显示相机预览。
我想修复 XCode 控制台中的警告iOS 16
, iPhone XS Max
配备双后置摄像头:
[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
并防止任何方向改变 - 没有帮助。
My CameraCell
code:
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 {}