2015-11-28 11 views
9

Sto visualizzando alcuni testi e immagini in un UITableView. L'immagine viene prima scaricata. Da prima che l'immagine venga scaricata, non conosco la dimensione dell'immagine, quindi inizialmente ho inserito uno UIImageView di dimensioni fisse. E quando l'immagine viene scaricata, ridimensiono lo UIImageView.Aggiornamento altezza cella dopo download immagini

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// Download image 

    dispatch_async(dispatch_get_main_queue(), ^{ 

    // UIImageView resizing 
    }); 
}); 

Tutto ciò avviene in cellForRowAtIndexPath.
I problemi che sto affrontando sono:
1. Come aggiorno l'altezza della cella? Considerando che ci possono essere molte immagini in una singola cella. Quindi ho bisogno di cambiare la posizione dell'immagine di fondo quando sopra un download.
2. Ho provato a utilizzare UITableViewbeginUpdates e endUpdates, ma questo scorre verso l'alto della cella dando una scarsa esperienza utente.

Ecco come appare l'interfaccia utente su reloadData. Ci sono 5 immagini da scaricare: UI experience after UITableView reloadData

+0

'beginUpdates' e' endUpdates' non hanno alcun effetto in questo caso in realtà * Non dovresti chiamare reloadData all'interno del gruppo * dice la documentazione. – vadian

+0

Ho provato 'reloadData'? –

+0

@HarikrishnanT: Sì. Fornisce una scarsa esperienza di interfaccia utente. – Nitish

risposta

11

Risposta breve

  • Dare respiro sufficiente per estimatedRowHeight
  • Modifica di un UITableViewCell una volta restituito da dequeueReusableCellWithIdentifier sarà non lavoro con le cellule presenti nella cache
  • innescare un ricarica singola cella con reloadRowsAtIndexPaths
  • Gestire la cache con Core Data e lasciareIl codice codicepuò far funzionare tutta l'interfaccia utente.

In Dettagli

codice qui sotto non scorrerà:

  1. Se la cella di essere rinfrescata è uguale o sotto l'orizzonte, il UITableView NON scorrere
  2. se la cella che viene aggiornata è sopra la parte superiore, lo UITableView non scorre
  3. lo UITableView scorrerà solo quando la cella è in bella vista e richiede più spazio di quello disponibile.

Lasciate UITableViewAutomaticDimension fare il duro lavoro

Devi dire a Cocoa Touch che la cellula è stantio, in modo che possa innescare un nuovadequeueReusableCellWithIdentifier, a cui si stanno per tornare una cella con l'altezza corretta.
In mancanza di ricaricare l'intera vista tabella o una sezione, e supponendo che gli indici siano stabili, richiamare -tableView:reloadRows:at:with: passando il indexPath della cella appena modificata e un'animazione .fade.

Codice:

override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.estimatedRowHeight = 250 // match your tallest cell 
    tableView.rowHeight = UITableViewAutomaticDimension 
} 

Usa URLSession. Quando un'immagine diventa disponibile, il fuoco reloadRows:at:with:

func loadImage(_ url: URL, indexPath: IndexPath) { 
    let downloadTask:URLSessionDownloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { 
     (location: URL?, response: URLResponse?, error: Error?) -> Void in 
     if let location = location { 
      if let data:Data = try? Data(contentsOf: location) { 
       if let image:UIImage = UIImage(data: data) { 
        self.cachedImages![indexPath.row] = image 
        self.cachedUrls![indexPath.row] = url 
        DispatchQueue.main.async(execute: {() -> Void in 
         self.tableView.beginUpdates() 
         self.tableView.reloadRows(
          at: [indexPath], 
          with: .fade) 
         self.tableView.endUpdates() 
        }) 
       } 
      } 
     } 
    }) 
    downloadTask.resume() 
} 

Esempio: recuperare un insieme casuale di immagini da * Wikipedia *

Xcode demo

► Trova questa soluzione su GitHub e aggiuntivi dettagli su Swift Recipes.

+0

In questo caso devo chiamare heightForRowAtIndex? – Nitish

+0

No. Nel progetto Xcode collegato verrà visualizzato che non è necessario alcun calcolo dell'altezza precedente. AutoLayout fa ** tutto ** il lavoro. È magico. – SwiftArchitect

+0

Se ho ragione, il layout automatico non è stato implementato nel codice per la cella della tabella. Questo suggerisce, ho bisogno di creare delle sottoview delle celle usando il layout automatico affinché funzioni? O quello non è richiesto. – Nitish

Problemi correlati