2017-05-09 6 views
0

Here is my CollectionView in TableViewCellCollection in TableViewCell scroll ist nicht glatt in swift3

In meinem Projekt CollectionView in TableViewCell wird nicht angezeigt und ich hinzugefügt

cell.collectionView.reloadData() 

in meinem Code. Nachdem ich hinzugefügt habe, CollectionView in TableViewCell angezeigt, aber ScrollView ist nicht glatt. Wie man dieses Problem löst. Wenn jemand irgendwelche Erfahrungen oder Ideen hat, hilf mir. Vielen Dank.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "homecell") as! HomeCategoryRowCell 

    let mainThemeList = mainHomeThemeTable[(indexPath as NSIndexPath).row] 

    DispatchQueue.main.async { 
     cell.categoryTitle.text = mainThemeList.main_name 
     cell.collectionView.reloadData() 
    } 


    return cell 
} 

Collection in meinem Projekt,

extension HomeCategoryRowCell : UICollectionViewDataSource { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

     debugPrint("assetsTable count \(assetsTable.count)") 
     return assetsTable.count 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! HomeVideoCell 

     let list = assetsTable[(indexPath as NSIndexPath).row] 
     let url2 = NSURL(string:list.poster_image_url) 
     let data2 = NSData(contentsOf:url2! as URL) 
     // debugPrint(list.poster_image_url) 
     DispatchQueue.main.async(){ 
      cell.movieTitle.text = list.name 
      cell.imageView.image = UIImage(data: data2! as Data) 

     } 

     return cell 

    } 

} 
+0

gab nur Delegierten und Datenquelle von collectioview in cellforrow Methode des Tableview Dont nachladen colletioview –

+0

collectionView.delegate = Selbst collectionView.dataSource = Selbst ich bereits hinzugefügt. Aber nicht das Problem gelöst @JeckyModi –

+0

Was laden Sie in CollectionView? Wenn Bilder dann bitte sicherstellen, dass Bilder nicht von hoher Auflösung sind. –

Antwort

1

Download Bild-URL Daten in collectionView: UICollectionView, cellForItemAt indexPath: IndexPath Delegierten - ASYNCHRONOUSLY

Erstellen Sie eine Klasse mit gemeinsamen Instanz

ersten Cache die Bilddaten mit Bezug auf Schlüssel Bild-URL

Warum brauchen wir die Daten zwischenspeichern?

Da - Während Scrollen wir müssen die Cache-Daten

ich einen Klassennamen nicht Bild jedes Mal so cache herunterladen, die bereits heruntergeladenen Bilddaten und das Rück erstellt: AsyncImageLoader dann habe ich eine Funktion, die eine Fertigstellung Handler, der die Daten nach Abschluss des Herunterladens zurückgibt Image

class AsyncImageLoader { 

//For caching the Image Data use NSCache 
var cache = NSCache<AnyObject, AnyObject>() 

//Shared Instance 
class var sharedLoader : AsyncImageLoader { 
    struct Static { 
     static let instance : AsyncImageLoader = AsyncImageLoader() 
    } 
    return Static.instance 
} 

//Completion handler function which returns the Image after complete downloading Image 
func imageForUrl(urlString: String, completionHandler: @escaping (_ image: UIImage?, _ url: String) ->()) { 


    let data = self.cache.object(forKey: urlString as AnyObject) as? NSData 

    if let goodData = data { //check already we cached the image before or not 

     let image = UIImage(data: goodData as Data) 

     DispatchQueue.main.async(execute: {() in 
      completionHandler(image, urlString) 
     }) 

     return 
    } 

    //if url Str is nil - check it or it crashes 
    if urlString.characters.count <= 0 { 


     DispatchQueue.main.async(execute: {() in 
      completionHandler(nil, urlString) // returns nil 
     }) 

     return 
    } 



    let strToUrl = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)! 


    URLSession.shared.dataTask(with: strToUrl, completionHandler: { (data, response, error) -> Void in 

     if error == nil{ 

      let image = UIImage(data: data!) 


      self.cache.setObject(data as AnyObject, forKey: urlString as AnyObject) //setting cache of image with key as Image url 


      DispatchQueue.main.async(execute: {() in 
       completionHandler(image, urlString) //completion handler call 
      }) 


     } else { 


      let image = UIImage(named: "logoBlue") //return dummy image if fails 


      DispatchQueue.main.async(execute: {() in 
       completionHandler(image, urlString) 
      }) 

      return 
     } 



    }).resume() 




} 

} 

Wie AsyncImageLoader Klasse verwenden?

Siehe unten, wie ich in collectionView: UICollectionView, cellForItemAt indexPath: IndexPath verwendet

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    AsyncImageLoader.sharedLoader.imageForUrl(urlString: list.poster_image_url) { (image, url) ->() in 

     DispatchQueue.main.async { 

      cell.imageView.image = image 
     } 
    } 
} 
+0

Wow! Nachdem ich deinen Code hinzugefügt habe, ist mein Projekt nun reibungslos. Danke für die beste Antwort! –

0
cell.layer.shouldRasterize = true 
cell.layer.rasterizationScale = UIScreen.main.scale 

Nachdem ich über Code hinzugefügt, mein Projekt mehr glatt. Ich werde das Beste und wieder mit der besten Lösung versuchen. Danke

0

Das ist, weil Sie Daten direkt von der URL und dann Bild von den Daten im Hauptgewinde erhalten. Sie sollten Bild-Download-Bibliothek verwenden, um das Bild von URL herunterladen Hier ist die gute dritte Partei, um Bild von URL asynchron herunterladen.

https://github.com/rs/SDWebImage

mit Try this Ich bin 100% sicher, dass es Ihr Problem lösen.

Dank

Verwandte Themen