Swift在第一个collectionview单元格中添加相机预览
Posted
技术标签:
【中文标题】Swift在第一个collectionview单元格中添加相机预览【英文标题】:Swift Add camera preview in first collectionview cell 【发布时间】:2020-09-07 18:18:17 【问题描述】:我想在第一个 collectionCell 中放置一个相机预览(就像 Telegram 一样)(而其他单元格中充满了来自画廊的照片)。当用户点击第一个单元格时,我需要显示一个摄像头。但是,当我点击单元格时,我在 xCode 中没有任何信息就崩溃了。
let cameraPicker: UIImagePickerController =
let picker = UIImagePickerController()
picker.sourceType = .camera
picker.cameraDevice = .front
picker.showsCameraControls = false
return picker
()
override func viewDidLoad()
super.viewDidLoad()
imageCollectionView.delegate = self
imageCollectionView.dataSource = self
if UIImagePickerController.isCameraDeviceAvailable(.front)
cameraPicker.delegate = self
//my cell size
let screenSize = CGSize(width: 80, height: 80)
let cameraAspectRatio = CGFloat(4.0 / 3.0)
let cameraImageHeight = screenSize.width * cameraAspectRatio
let scale = screenSize.height / 40
cameraPicker.cameraViewTransform = CGAffineTransform(translationX: 0, y: (screenSize.height - cameraImageHeight)/2)
cameraPicker.cameraViewTransform = cameraPicker.cameraViewTransform.scaledBy(x: scale, y: scale)
cameraPicker.view.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height)
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
guard let cell = cell as? PSTBaseImageCollectionViewCell else return
cell.imageView.subviews.forEach$0.removeFromSuperview()
cell.imageView.image = nil
if indexPath.row == 0
else
let asset = allPhotos?.object(at: indexPath.row - 1)
cell.imageView.fetchImageFromAsset(asset: asset!, contentMode: .aspectFill, targetSize: CGSize(width: asset!.pixelWidth, height: asset!.pixelHeight))
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if indexPath.row == 0
if UIImagePickerController.isSourceTypeAvailable(.camera)
cameraPicker.showsCameraControls = true
present(cameraPicker, animated: true)
在这种情况下,如果我点击第一个单元格,相机会正常显示,但是当我在单元格中添加相机预览时,相机视图不再显示
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
guard let cell = cell as? PSTBaseImageCollectionViewCell else return
cell.imageView.subviews.forEach$0.removeFromSuperview()
cell.imageView.image = nil
if indexPath.row == 0
cell.imageView.addSubview(cameraPicker.view)
else
let asset = allPhotos?.object(at: indexPath.row - 1)
cell.imageView.fetchImageFromAsset(asset: asset!, contentMode: .aspectFill, targetSize: CGSize(width: asset!.pixelWidth, height: asset!.pixelHeight))
我错过了什么?
【问题讨论】:
【参考方案1】:你为什么使用 willDisplay 来设置你的单元格?
https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/1618087-collectionview?language=objc
“讨论 集合视图在将单元格添加到其内容之前调用此方法。使用这种方法来检测单元格的添加,而不是监控单元格本身以查看它何时出现。”
使用这个:https://developer.apple.com/documentation/uikit/uicollectionviewdatasource/1618029-collectionview
【讨论】:
实际上,它并没有改变任何东西。应用程序因同样的事情而崩溃 你使用dequeueReusableCell(withReuseIdentifier:for:)了吗? 什么是崩溃信息? 当然。主要问题是,当我不添加 cell.addSubview(cameraPicker.view) 时,当前的相机选择器正在工作,以防它仅与线程 1:EXC_BAD_ACCESS(代码 = 2,地址 = 0x16d093ff0)而崩溃并且没有提供任何信息。 developer.apple.com/documentation/uikit/uiimagepickercontroller 看起来您的选择器控制器设置不完整。我会查看文档并至少设置委托。【参考方案2】:我可能为时已晚,但我找到了解决方案。 我在我的应用程序中做了同样的事情,但是我添加了一个 UIView 而不是一个 imageview,并将它的 isUserInteractionEnabled 设置为 false
在 cellForRowAt 中:
if indexPath.row == 0
cell.preview.addSubview(cameraPicker.view)
cameraPicker.view.frame = cell.imageView.bounds
cell.preview.isUserInteractionEnabled = false
else
let asset = allPhotos?.object(at: indexPath.row - 1)
cell.imageView.fetchImageFromAsset(asset: asset!, contentMode: .aspectFill, targetSize: CGSize(width: asset!.pixelWidth, height: asset!.pixelHeight))
我在单元格中仍然有一个 imageView,但这只是为了显示带有我的应用程序徽标的渐变色调(alpha 设置为 0.3),以便它看起来像一个叠加层
编辑:我还意识到您从未为相机预览设置框架
【讨论】:
以上是关于Swift在第一个collectionview单元格中添加相机预览的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中复制/复制自定义 collectionview 单元格?
在 CollectionView 中添加第二个自定义单元格 - Swift
Swift iOS -CollectionView 如何将单元格滚动到屏幕外