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
例如。
我需要在 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
例如。