gpt4 book ai didi

ios - 如何使用异步图像实现 UICollectionViewDelegateFlowlayout 的 sizeForItemAtIndexPath?

转载 作者:可可西里 更新时间:2023-11-01 02:17:46 48 4
gpt4 key购买 nike

我正在尝试实现 UICollectionViewDelegateFlowlayoutsizeForItemAtIndexPath,类似于本教程:http://www.raywenderlich.com/78550/beginning-ios-collection-views-swift-part-1

我遇到的问题是我的照片是通过网络上的异步调用下载的,因此当调用 sizeForItemAtItemPath 时,我的图像尚未加载。换句话说,下面的代码在 imageArray 上崩溃了。如何延迟该方法直到我的图像加载完毕?如果没有图像可用,我也尝试使用硬编码和高度值,但随后我只返回那些硬编码值,即 sizeForItemAtIdexPath 在图像加载后似乎不会再次调用。

func pinImageForIndexPath(indexPath: NSIndexPath) -> UIImage {
return imageArray[indexPath.row]
}



}

extension PinCollectionViewController : UICollectionViewDelegateFlowLayout {
//1
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

let pinImage = pinImageForIndexPath(indexPath)
//2
if var size = pinImage.size as? CGSize {
size.width += 10
size.height += 10
return size
}
return CGSize(width: 100, height: 100)
}

//3
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
insetForSectionAtIndex section: Int) -> UIEdgeInsets {
return sectionInsets
}
}



override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! PinCollectionViewCell

cell.pinImage?.pin_updateWithProgress = true
cell.pinImage?.image = nil

var actInd: UIActivityIndicatorView = UIActivityIndicatorView()
actInd.frame = cell.pinImage.bounds
actInd.hidesWhenStopped = true
actInd.activityIndicatorViewStyle =
UIActivityIndicatorViewStyle.Gray
cell.addSubview(actInd)
actInd.startAnimating()


if let pinImageURL = self.pins[indexPath.row].largestImage().url {


cell.pinImage?.pin_setImageFromURL(pinImageURL, completion: ({ (result : PINRemoteImageManagerResult) -> Void in


actInd.stopAnimating()
if let image = result.image {
self.imageArray.append(image)
}

self.collectionView?.reloadItemsAtIndexPaths([indexPath])

}))


}

return cell
}

最佳答案

确实,在您没有加载图像之前,您应该返回一些硬编码值。严格来说,您应该为尚未加载的图像显示一些预定义的占位符。

当你的图像被加载时(当异步下载操作成功完成时),你应该调用 -reloadItemsAtIndexPaths:在带有这些单元格索引路径的 Collection View 上,这些单元格的图像可用。

关于ios - 如何使用异步图像实现 UICollectionViewDelegateFlowlayout 的 sizeForItemAtIndexPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506906/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com