2016-06-03 8 views
0

Ich habe eine UICollectionView (horizontal) und putted dort in Zellen Bilder mit angewendeten Filtern.Wie wird das gefilterte Bild im Array gespeichert?

Ich tue dies:

var filtered = [Int: UIImage]() 
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("filterCell", forIndexPath: indexPath) as! filterCell 

    let op1 = NSBlockOperation {() -> Void in 
     let img = self.image! 
     let img1 = self.applyFilterTo(img, filter: self.filtersImages[indexPath.row]) 

     NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in 

      if let filtered = self.filtered[indexPath.row] { 
       cell.imageView.image = self.filtered[indexPath.row] 
      } else { 
       self.filtered[indexPath.row] = img1 
       cell.imageView.image = self.filtered[indexPath.row] 

      } 
     }) 
    } 

    self.queue!.addOperation(op1); 

    return cell 
} 

wo:

var myFilter = CIFilter() 
func applyFilterTo(image: UIImage, filter: String) -> UIImage { 
    let sourceImage = CIImage(image: image) 

    myFilter = CIFilter(name: filter)! 
    myFilter.setDefaults() 

    myFilter.setValue(sourceImage, forKey: kCIInputImageKey) 

    let context = CIContext(options: nil) 

    let outputCGImage = context.createCGImage(myFilter.outputImage!, fromRect: myFilter.outputImage!.extent) 

    let newImage = UIImage(CGImage: outputCGImage, scale: image.scale, orientation: image.imageOrientation) 

    return newImage 
} 

So das Prinzip hier bewirbt ich meinen Filter auf das Bild, es in meinem Wörterbuch speichern und später auf Scroll-Last Bilder aus dem Wörterbuch . Aber es braucht immer noch Bilder, wendet Filter an und zeigt es später. Also beim Scrollen meine UICollectionView friert ein, Filter auf Bildern ändern sich.

Was mache ich falsch und wie kann ich das beheben?

Antwort

0

Warum müssen Sie let img1 = self.applyFilterTo(img, filter: self.filtersImages[indexPath.row]) wenn Bild bereits in self.filtered[indexPath.row] tun?

Also ich denke, Sie sollten überprüfen if let filtered = self.filtered[indexPath.row] { und wenn nicht, dann starten Sie Filter es.

Für Ihren Code wird es so etwas wie dieses:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("filterCell", forIndexPath: indexPath) as! filterCell 

    if let filtered = self.filtered[indexPath.row] { 
     cell.imageView.image = filtered 
    } else { 
     let op1 = NSBlockOperation {() -> Void in 
     let img = self.image! 
     let img1 = self.applyFilterTo(img, filter: self.filtersImages[indexPath.row]) 

     NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in 
      self.filtered[indexPath.row] = img1 
      cell.imageView.image = self.filtered[indexPath.row] 
     }) 
     } 

     self.queue!.addOperation(op1); 
    } 

    return cell 
} 
Verwandte Themen