我想创建一个类似于 Apple 在 Messages.app 中的外观,您可以在其中拥有图像的水平滑动视图。
我知道在 iOS 8 中最好的方法是使用新的 Photos 框架,并且可能与水平的UICollectionView
.
我UICollectionView
在我的视图控制器故事板中将我的固定高度固定在一个设定的高度,并从顶部定位,然后viewDidLoad
我写:
let assetCollectionsResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumRecentlyAdded, options: nil)
let recentlyAddedCollection = assetCollectionsResult.firstObject as! PHAssetCollection
recentlyAddedFetchResult = PHAsset.fetchAssetsInAssetCollection(recentlyAddedCollection, options: nil)
recentlyAddedFetchResult
视图控制器上的实例变量在哪里。
然后,我创建了一个自定义UICollectionViewCell
子类,该子类简单地UIImageView
将 Auto Layout 固定到单元格的边缘。
在UICollectionViewDataSource
我拥有的方法中:
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return recentlyAddedFetchResult.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("ImageCell", forIndexPath: indexPath) as! ImageCollectionViewCell
let asset = recentlyAddedFetchResult[indexPath.row] as! PHAsset
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSize(width: 300.0, height: 300.0), contentMode: .AspectFill, options: nil) { (result, info) in
cell.imageView.image = result
}
return cell
}
但是,我现在明白我必须实施sizeForItem
,但我很困惑如何处理。我能想出的最好方法是再次执行上述提取,但图像尺寸较小,因为我只需要该比率,然后基于该比率返回一个尺寸。但是获取是异步的,所以我必须先保存它,然后再返回,对吧?
我尝试如下:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if let cellSize = cellSizeCache[indexPath] {
return cellSize
} else {
let asset = recentlyAddedFetchResult[indexPath.row] as! PHAsset
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSize(width: 20.0, height: 20.0), contentMode: .AspectFill, options: nil) { (result, info) in
let imageRatio = result.size.width / result.size.height
let width = 140 * imageRatio
self.cellSizeCache[indexPath] = CGSize(width: width, height: 140.0)
collectionView.reloadItemsAtIndexPaths([indexPath])
}
return CGSize(width: 140, height: 140)
}
}
但是控制台只是被这条消息的无限循环淹没:
项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值。
但它是。集合视图为 150 高,没有剖面插图。即使我删除了缓存,所以每次它仍然抱怨它时它只会返回 140x140。为什么?如果我把它调低到 70x70 左右,它工作得很好,但我不知道为什么。
最重要的是,滚动器中的前两个图像很少在第一次加载时出现,只有在我滚动时才会出现。
我在这里做错了什么?关于新照片框架的教程很少,所以尽管我尽了最大的努力,我还是无法弄清楚我做错了什么。