Come arrivare altezza di UITableView quando le cellule sono dinamicamente le dimensioni?

Ho una UITableView con le cellule che sono dinamicamente dimensioni. Il che significa che mi sono prefissato:

tableView.estimatedRowHeight = 50.0
tableView.rowHeight = UITableViewAutomaticDimension

Ora voglio ottenere l’altezza di tutta la tabella. Ho cercato di ottenerlo attraverso tableView.contentSize.height ma che restituisce solo la stima dell’altezza di una riga, e non la dinamica effettiva altezza della vista tabella.

Come faccio a ottenere l’altezza dinamica di tutta la tabella di vista?

  • Dove hai trovato l’altezza della tableView?
  • auto.tableView.fotogramma.la dimensione.altezza;
  • che non funziona più.
  • stackoverflow.com/questions/40034506/…
  • stackoverflow.com/questions/39888512/… @solistice fare riferimento a questa risposta risolvere il tuo problema
  • Moradiya Grazie per il suggerimento, ma io non sto cercando di ottenere il cell altezza. Sto cercando di ottenere l’intera tabella di visualizzazione di altezza.
  • quindi basta creare un CGFloat vericabili e scrivi un codice .. lasciate dimensioni : CGFloat = tableview.limiti.altezza;

InformationsquelleAutor leonardloo | 2016-10-17

 

8 Replies
  1. 21

    Finalmente ho inciso una soluzione:

    tableView.contentSize.height non lavoro per dinamica cellule perché non restituirà solo il numero di celle * estimatedRowHeight.

    Quindi, per ottenere la tabella dinamica, vista l’altezza, è possibile cercare tutte le celle visibili, e la somma delle loro altezze. Si noti che questo funziona solo per la tabella di vista che sono più brevi rispetto a quelle dello schermo.

    Tuttavia, prima di noi di cui sopra per cercare celle visibili, è importante sapere che la nota abbiamo bisogno di ottenere la tabella di visualizzazione sullo schermo in modo che possiamo ottenere celle visibili. Per farlo, si può impostare un vincolo altezza per la visualizzazione della tabella a qualche numero arbitrariamente grande proprio così che appare sullo schermo:

    1. Impostare l’altezza della tabella di vista vincolo:

      //Class variable heightOfTableViewConstraint set to 1000
      heightOfTableViewConstraint = NSLayoutConstraint(item: self.tableView, attribute: .height, relatedBy: .equal, toItem: containerView, attribute: .height, multiplier: 0.0, constant: 1000)
      containerView.addConstraint(heightOfTableViewConstraint)
    2. Chiamata tableView.layoutIfNeeded(), e una volta completato, cercare le celle visibili, il bilancio della loro altezza, e modificare il heightOfTableViewConstraint:

      UIView.animate(withDuration: 0, animations: {
          self.tableView.layoutIfNeeded()
          }) { (complete) in
              var heightOfTableView: CGFloat = 0.0
              //Get visible cells and sum up their heights
              let cells = self.tableView.visibleCells
              for cell in cells {
                  heightOfTableView += cell.frame.height
              }
              //Edit heightOfTableViewConstraint's constant to update height of table view
              self.heightOfTableViewConstraint.constant = heightOfTableView
      }
    • Da dove chiama questo codice per aggiornare il vincolo altezza della tableView?
    • In viewDidLoad
    • Questo ha funzionato per me, ma ho dovuto mettere il mio codice in viewDidLayoutSubviews() perché in viewDidLoad() le celle non sono state ancora caricate.
    • Questo è un molto prezioso! Ho bisogno di cambiare l’altezza di una tableview per oggi l’estensione widget che usato auto dimensionamento cellule (lo faccio a livello di programmazione). Il trucco è stato (come hai detto tu) per impostare un’altezza di 1000 per ottenere tutte le cellule espanse, quindi sommare le celle visibili altezze e quindi impostare la nuova altezza con layoutIf necessario. Grande, grazie.
    • Che cosa succede se ho più sezioni & ha bisogno di ottenere la totale tableview altezza ?
    • questo genere di cose è così sporca che mi dà ansia. ciò che è Apple che fa???
    • impostare la tableview altezza di 1000 iniziale un po ‘ strano per la prima volta di carico (basso numero di cellulare, come 2, 3). Così giocare in giro con l’alfa. Funziona come un fascino.

  2. 0

    è già stato risposto, ma voglio condividere la mia esperienza.

    Ho lo stesso problema. Ho cercato risposte a molte domande simili e provato le loro risposte e non funziona.

    Finalmente ho trovato leonardloo risposta. Grazie mille, ma non ha risolto il mio problema di sicurezza. Voglio solo completare la sua risposta. Ho messo questo codice da la sua risposta:

    UIView.animate(withDuration: 0, animations: {
    self.tableView.layoutIfNeeded()
    }) { (complete) in
        var heightOfTableView: CGFloat = 0.0
        //Get visible cells and sum up their heights
        let cells = self.tableView.visibleCells
        for cell in cells {
            heightOfTableView += cell.frame.height
        }
        //Edit heightOfTableViewConstraint's constant to update height of table view
        self.heightOfTableViewConstraint.constant = heightOfTableView
    }

    in questo blocco di codice:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ...
        if indexPath.row == data.count-1{ 
            //Insert the code here
        }
        return cell
    }

    Significa che dopo tutte le righe nella tabella sono stati caricati, aggiorniamo l’altezza della riga con quel pezzo di codice.
    E funziona!!!!

    • Questo funziona! Grazie Ebed! Solo un piccolo problema. Hai bisogno di fare “heightOfTableView += cella.fotogramma.altezza” ancora una volta dopo il ciclo perchè l’ultima cella non è tra i visibleCells di sicurezza 😉
    • qui la risposta funziona parzialmente,facendo questo si ottiene solo le celle visibili altezza, ma non tutte le cellule
  3. 0

    Anche se @leonardloo la risposta è parzialmente corretta e può soddisfare le esigenze di molte persone, ho voluto condividere come ho risolto il mio problema.

    Ho avuto una grande tableView con righe grandi e avevano lo stesso problema. Quando ho applicato @leonardloo la risposta, ho visto che disegna solo il numero di celle visibili, che ha trovato all’inizio e da esso trae 1 f. considerando che è supposto per attirare 5 (il mio datasource conte).

    Per risolvere questo problema, ho trovato una semplice soluzione:

    UIView.animate(withDuration: 0, animations: {
    self.tableView.layoutIfNeeded()
    }) { (complete) in
        var heightOfTableView: CGFloat = 0.0
        //Get visible cells and sum up their heights
        let cells = self.tableView.visibleCells
        for cell in cells {
            heightOfTableView += cell.frame.height
        }
        //Edit heightOfTableViewConstraint's constant to update height of table view
        //Set tableView's constraint to height + 1 so that 
        //it can still draw the next visible cell it's supposed to.
        self.heightOfTableViewConstraint.constant = heightOfTableView + 1
    }

    Il punto qui è di lasciarlo a disegnare la successiva cella in modo tale che esso verrà conteggiato in visibleCells e impostando vincolo costante di altezza + 1. Ho provato e sembra funzionare come un fascino ora.

  4. -1

    Si dovrebbe calcolare l’altezza della tableView nel seguente metodo delegato,

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    
        //Get the height required for the TableView to show all cells
        if indexPath.row() == (tableView.indexPathsForVisibleRows.last! as! NSIndexPath).row {
            //End of loading all Visible cells
            float heightRequiredForTable = tableView.contentSize.height
    
            //If cell's are more than 10 or so that it could not fit on the tableView's visible area then you have to go for other way to check for last cell loaded 
        }
    }
    • Sto cercando di ottenere l’altezza della tabella di visualizzazione in modo da poter impostare i vincoli per la tabella di visualizzazione a livello di programmazione. Non penso che le opere sopra..
    • Se si desidera impostare l’altezza della tableView come l’altezza necessaria per tutti i cell allora si avrebbe bisogno di aggiungere UITableView come un bambino di UIScrollView e quindi creare il heightConstraint e di aggiornamento nello stesso delegato metodi di spiegare nella mia risposta a questa domanda – stackoverflow.com/questions/38044803/…
  5. -1

    È possibile aggiungere le estensioni.

    Swift 4:

    extension UITableView {
    
        //sums the height of visible cells
        func heightOfVisibleCells() -> CGFloat {
            return self.visibleCells.map({ $0.frame.height }).reduce(0, +)
        }
    
    }
  6. -3

    Semplicemente mantenere un array di tipo CGFLoat e aggiungere UITableViewAutomaticDimension in cellForRowAt indexPath delegato di tableview

    var cellHeight = [CGFloat]()
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    cellHeight.append(UITableViewAutomaticDimension)
    }
    • Scusate per errori grammaticali che (Bug) modificato in seguito, ma per me funziona bene
  7. -3

    Io aggiungere la mia risposta qui, visto che ho lottato con questo un po’.

    Mia tabella di vista era uso di sezioni che aveva intestazioni, in modo che solo ottenere l’altezza delle celle visibili, non funzionava. Quello che ho finito per fare il primo set è stato un super grande altezza, per il tableView in modo che i contenuti saranno tutti essere aggiunto. Poi, l’ultimo cell del tableView, ho ridimensionare il tableView per avere la stessa altezza come la sua content.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      ... //do your normal cell processing
    
      //determine height and change it
      if indexPath.section == (self.sectionTitles.count - 1) && indexPath.row == (sectionData.count - 1) {
    
        UIView.animate(withDuration: 0, animations: {
          self.tableView.layoutIfNeeded()
        }) { complete in
    
          //Edit heightOfTableViewConstraint's constant to update height of table view
          self.tableViewHeightConstraint.constant = self.tableView.contentSize.height
        }
      }
    }
  8. -6

    si può provare questo codice

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    
    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    • Grazie per il suggerimento. Ho provato in questo modo ma purtroppo ancora non funziona.

Lascia un commento