Swift - cellForItemAtIndexPath 在调整图像大小时展开可选值

Swift - cellForItemAtIndexPath unwrapping an Optional value when resizing image

我需要在 swift 中滚动集合视图时动态调整 imagView 的大小...

我使用这个函数来获取滚动事件:

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

                // get a reference to our storyboard cell
         let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
         let indexPathItem = self.items[indexPath.item]
         if let myImage = cell.myImage{
             myImage.image = imageWithImage(UIImage(named: indexPathItem)!, scaledToSize: CGSize(width: sizeImage, height: sizeImage))
         } 

      return cell
    }

以及调整图片大小的函数:

func imageWithImage(image:UIImage,scaledToSize newSize:CGSize)->UIImage{

    UIGraphicsBeginImageContext( newSize )
    image.drawInRect(CGRect(x: 0,y: 0,width: newSize.width,height: newSize.height))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage.imageWithRenderingMode(.AlwaysTemplate)
}

调试在 运行 这一行时停止:

myImage.image = imageWithImage(UIImage(named: indexPathItem)!, scaledToSize: CGSize(width: sizeImage, height: sizeImage))

有错误

"fatal error: unexpectedly found nil while unwrapping an Optional value"

如果我用这个替换它就可以工作:

cell.myImage.image = UIImage(named : self.items[indexPath.item])

但显然并没有缩小图像

能帮帮我吗???

解决方案: 我需要调整对象大小 "cell.myImage" 而不是 "cell.myImage.image" 所以解决了:

  cell.myImage.frame = CGRect(x:0.0,y:0.0,width:sizeImage,height:sizeImage) 

并将 imageView 的模式设置为适合纵横比的单元格。

您可以使用如下更安全的代码来避免在展开 Optional 值时发生崩溃。

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

        // get a reference to our storyboard cell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! YourCell

        cell.myImage?.image = imageWithImage(UIImage(named: self.items[indexPath.item]), scaledToSize: CGSize(width: sizeImage, height: sizeImage))

        return cell
    }

    func imageWithImage(image:UIImage?,scaledToSize newSize:CGSize)->UIImage?{

        guard let drawImage = image else {

            return nil
        }

        UIGraphicsBeginImageContext( newSize )
        drawImage.drawInRect(CGRect(x: 0,y: 0,width: newSize.width,height: newSize.height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage?.imageWithRenderingMode(.AlwaysTemplate)
    }

您的 cellForItemAtIndexPath 代码在

行下方不完整
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as!

所以我添加了 YourCell 例如。