3

我想创建一个类似于 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 左右,它工作得很好,但我不知道为什么。

最重要的是,滚动器中的前两个图像很少在第一次加载时出现,只有在我滚动时才会出现。

我在这里做错了什么?关于新照片框架的教程很少,所以尽管我尽了最大的努力,我还是无法弄清楚我做错了什么。

4

0 回答 0