2017-06-02 8 views
2

Ich versuche, dynamisch Größe UITableViewCells, die Höhe basierend auf dem Seitenverhältnis eines Bildes von einem Server heruntergeladen zu erstellen.Swift - Dynamische UITableViewCell Größe basierend auf Bildseitenverhältnis

Wenn beispielsweise die Höhe eines Bildes doppelt so groß ist, möchte ich, dass die Höhe der UITableViewCell doppelt so groß ist wie die Bildschirmbreite, damit das Bild die volle Breite des Bildschirms einnehmen und das Seitenverhältnis beibehalten kann.

Ich habe versucht, Constraints zu der Zelle hinzuzufügen und UITableViewAutomaticDimension zu verwenden, um die Höhe zu berechnen, aber das Problem, das mir gegenübersteht, ist, dass ich das Seitenverhältnis des Bildes nicht kennen kann, bis es heruntergeladen wird Die Zellen beginnen klein, und sobald die TableView manuell aktualisiert wird, wird die Zelle mit der richtigen Größe angezeigt.

Ich habe keine Lust, jede einzelne Zelle neu zu laden, wenn es heruntergeladen wird, ist ein guter Weg, Dinge zu tun.

Ist dieser Ansatz der beste Weg, dies zu tun? Ich kann nicht für das Leben von mir denken, wie ich das sonst tun könnte, da ich das Seitenverhältnis nicht innerhalb der Zelle selbst kennen kann, wenn es initialisiert wird.

+0

können Sie Bild Breite und Höhe an den Server senden und dann bei der Rückkehr können Sie Zelle Breite und Höhe entsprechend dem Bild geben. –

Antwort

6

Für Dafür verwende ich zuerst ein Wörterbuch [Int:CGFloat] die berechnete Körpergröße von Zellen zu halten, dann in der heightForRowAtIndexpath Methode die Werte in Ihrem Wörterbuch keeped verwenden, in Ihrer cellForRowAtIndexpath Methode sollten Sie Ihr Bild herunterladen, berechnen Sie das Seitenverhältnis, multiplizieren Sie Ihre Zellenbreite oder Ihre Bildbreite von Ihrem Seitenverhältnis und die Höhe in Korrespondenten indexPath Nummer in Ihrem Wörterbuch

in Code in etwa so berechnet setzten, ist dies ein Beispiel für Code alamofire unter Verwendung der Bilder zu laden

var rowHeights:[Int:CGFloat] = [:] //declaration of Dictionary 


    //My heightForRowAtIndexPath method 
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if let height = self.rowHeights[indexPath.row]{ 
      return height 
     }else{ 
      return defaultHeight 
     } 
    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

if let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell") as? ImageCell 
     { 
     let urlImage = Foundation.URL(string: "http://imageurl") 
     cell.articleImage.af_setImage(withURL: urlImage, placeholderImage: self.placeholderImage, filter: nil, imageTransition: .crossDissolve(0.3), completion: { (response) in 

      if let image = response.result.value{ 
       DispatchQueue.main.async { 

        let aspectRatio = (image! as UIImage).size.height/(image! as UIImage).size.width 
        cell.articleImage.image = image 
        let imageHeight = self.view.frame.width*aspectRatio 
        tableView.beginUpdates() 
        self.rowHeights[indexPath.row] = imageHeight 
        tableView.endUpdates() 

       } 
      } 
     }) 
     } 

Ich hoffe das hilft

Verwandte Themen