在Swift中编写多个图像选择器。步骤如下:
从照片库中获取所有资源
在UICollectionView
对于那些视频,请在单元格的右下角放置一个标有“视频”的小标签
这是我的代码:
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
}
...
}
}
问题
有些照片的右下角也有“视频”标签,为什么?此外,在关闭屏幕并重新打开它之后,一些具有“视频”标签的照片现在不再拥有它了,但是,有些现在没有。我应该怎么做呢?
更新
这是选择器的样子,所有标记为“视频”的照片,事实上,其中只有一部分真的是视频:
答案 0 :(得分:1)
我想问题是您要在UILabel
中创建并添加cellForRowAt:
。因为细胞将被重复使用,因此视频标签将在这些细胞中随机出现。我建议只从storyboard或XIB添加标签。或者您也可以在awakeFromNib
中创建和添加标签但是,您必须实施prepareForReuse
并在那里隐藏标签。