在Swift中,照片库资产的mediaType有时是不准确的

时间:2018-04-08 21:33:49

标签: ios swift

在Swift中编写多个图像选择器。步骤如下:

  1. 从照片库中获取所有资源

  2. UICollectionView

  3. 中显示它们的缩略图
  4. 对于那些视频,请在单元格的右下角放置一个标有“视频”的小标签

  5. 这是我的代码:

    class PhotoLibraryViewController: UICollectionViewController {
        private class PhotoLibraryAsset {
            var assetType: String        // Either "Video" or "Photo"
            var thumbnail: UIImage
    
            init(assetType: String, thumbnail: UIImage) {
                self.assetType = assetType
                self.thumbnail = thumbnail
            }
        }
    
        var photos: [PhotoLibraryAsset]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            getAllPhotos()
        }
    
        private func getAllPhotos() {
            // Grab all photos & videos instead of just photos
            let fetchOptions = PHFetchOptions()
            fetchOptions.sortDescriptors = [
                NSSortDescriptor.init(
                    key: "creationDate",
                    ascending: false
                )
            ]
            fetchOptions.predicate = NSPredicate.init(
                    format: "mediaType = %d || mediaType = %d",
                    PHAssetMediaType.image.rawValue,
                    PHAssetMediaType.video.rawValue
                )
            fetchOptions.fetchLimit = Int.max
    
            let imageManager = PHImageManager()
            let requestOptions = PHImageRequestOptions()
            requestOptions.isSynchronous = true
            let fetchResult = PHAsset.fetchAssets(with: fetchOptions)
    
            for i in 0..<result.count {
                let asset = result.object(at: i)
    
                // Now generate thumbnails for the assets
                imageManager.requestImage(
                    for: asset,
                    targetSize: ...,
                    contentMode: .aspectFill,
                    options: requestOptions,
                    resultHandler: { (image, error) in
                        if let photo = image {
                            self.photos.append(
                                PhotoLibraryAsset.init(
                                    asset.mediaType == .video ? "Video" : "Photo",
                                    thumbnail: image!
                                )
                            )
                        }
                    }
                )
            }
        }
    
        override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            ...
    
            let photo = photos[indexPath.row]
            if photo.assetType == "Video" {
                // Add a "Video" label to the bottom-right corner of the cell
            }
    
            ...
        }
    }
    

    问题

    有些照片的右下角也有“视频”标签,为什么?此外,在关闭屏幕并重新打开它之后,一些具有“视频”标签的照片现在不再拥有它了,但是,有些现在没有。我应该怎么做呢?

    更新

    这是选择器的样子,所有标记为“视频”的照片,事实上,其中只有一部分真的是视频:

    enter image description here

1 个答案:

答案 0 :(得分:1)

我想问题是您要在UILabel中创建并添加cellForRowAt:。因为细胞将被重复使用,因此视频标签将在这些细胞中随机出现。我建议只从storyboard或XIB添加标签。或者您也可以在awakeFromNib中创建和添加标签但是,您必须实施prepareForReuse并在那里隐藏标签。