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 不可重用单元格

如何在 Swift 中复制/复制自定义 collectionview 单元格?

在 CollectionView 中添加第二个自定义单元格 - Swift

Swift iOS -CollectionView 如何将单元格滚动到屏幕外

以编程方式从 CollectionView 单元推送 viewController 不起作用 - swift

一个 collectionView 中的不同类型的单元格