0

мне нужно изменить размер динамически в imagView при прокрутке представления коллекции в скор ...Swift - cellForItemAtIndexPath разворачивание необязательного значения при изменении размера изображений

я использовать эту функцию для ПОЛУЧИТЬ событие прокрутки:

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 установлен в камеру, как аспект приступ.

+0

Как вы создаете объект indexPathItem? –

+0

О да ... с этой строкой: 'let indexPathItem = self.items [indexPath.item]' items это мой массив с именем изображений – Ray13

+0

Вам действительно нужно изменить размер вашего изображения? Кажется, что ваша прокрутка пострадает, почему бы просто не подогнать образ к imageView? –

ответ

0

Вы можете использовать безопасный код, как показано ниже, чтобы избежать сбоев при развертывании необязательного значения.

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, например.

+0

Да, теперь я исправляю свой код ... YourCell - это MyCollectionViewCell – Ray13

+0

Я пытаюсь выполнить ваш код, но с «return newImage? .imageWithRenderingMode (.AlwaysTemplate)» в функции я вижу свое изображение, окрашенное синим ... , если я удалю эту строку, компилирует, но не работает ... изображений все еще большие - Ray13 14 мин назад – Ray13

+0

на самом деле вы можете вернуть newImage в одиночку и не нужно вызывать imageWithRenderingMode, если вы не хотите, чтобы он был как образ шаблона. – Natarajan