2016-03-15 18 views
6

Desidero calcolare la dimensione del contenuto del mio UITableView. Sto usando l'autolayout con altezza UITableViewAutomaticDimension.UITableView dimensioni del contenuto durante l'utilizzo del layout automatico

Provato per ottenere [UITableView contentsize] dopo aver ricaricato tableview, in tal caso l'altezza viene calcolata in base a estimatedRowHeight.

self.tableView.estimatedRowHeight = 50; 
self.tableView.rowHeight = UITableViewAutomaticDimension; 

Delegato -

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewAutomaticDimension; 
} 

Cercando di ottenere dimensioni contenuti e assegnarlo a altezza vincolo.

[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Qualche suggerimento? Grazie in anticipo.

Edit:

Infine sto risolto il problema con qualche ritocco. Ho modificato l'altezza di Tableview a max (Nel mio caso 300 è max) prima di ricaricare i dati sulla tabella, quindi tableview ha spazio per ridimensionare tutte le celle.

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Grazie per l'aiuto.

+0

Puoi spiegare il problema in dettaglio? –

+0

Voglio il contenuto di tableview. quindi posso modificare tableview e frame superview rispetto al contenuto. Sto usando autolayout e UITableViewAutomaticDimension. quindi non funziona esattamente. – OMK

+0

Se si utilizza 'Autolayout' non è possibile modificare il frame. Devi giocare con 'NSLayoutContraints'. –

risposta

7

Infine sto risolto il problema con qualche ritocco. Ho modificato l'altezza di Tableview a max (Nel mio caso 300 è max) prima di ricaricare i dati sulla tabella, quindi tableview ha spazio per ridimensionare tutte le celle.

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Pubblicare questo così sarà utile per gli altri.

+0

dove usare questo codice? –

+0

Come sai che 300 è massimo (o sufficiente). Ho una vista tabella in scrollview e tableview dovrebbe avere un altezza del suo contenuto. E trovo che dovrei dare a tableview un'altezza iniziale maggiore di '([self.tableView numberOfRowInSection: 0] - 1) * EstimateHeight'. Anche l'altezza deve essere impostata nel metodo 'viewWillLayoutSubviews', funziona solo, non so perché. – ooops

+0

Questo in realtà funziona. Sai perché dobbiamo prima impostare constraint.constant al massimo? Senza di esso questo non funziona. –

5

Infine, ho capito il tuo problema ed ecco la soluzione.

Spero che tu abbia già fatto questo.

  1. Per prima cosa, inserire l'altezza di correzione di UITableView.
  2. Quindi prendere il vincolo IBOutlet di UITableView Altezza.
  3. Quindi, con il metodo viewDidLayoutSubviews è possibile ottenere l'altezza originale UITableView dopo aver inserito i dati.

Aggiornare il codice qui sotto:

override func viewDidLayoutSubviews() { 

    constTableViewHeight.constant = tableView.contentSize.height 
} 

Aggiornamento:

self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;

Si prega di controllare questo.

+3

Ho fatto lo stesso. Non funziona. tableView.contentSize viene calcolato in base a EstimateRowHeight. Ho bisogno di altezza dopo aver ridimensionato tutte le celle. – OMK

+0

@OMK Controlla la risposta modificata –

+0

Grazie per l'aiuto. Ho trovato una domanda modificata con una soluzione. – OMK

0

È possibile provare due cose,

  1. chiamata sotto metodo solo dopo qualche secondo di ritardo dopo tableView ricaricati completamente.

    - (void)adjustHeightOfTableview 
    { 
        dispatch_async(dispatch_get_main_queue(), ^{ 
    
        [self.tableView reloadData]; 
    
        //In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me) 
        [self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3]; 
        }); 
    } 
    
  2. Quando si chiama il metodo di cui sopra non rimettere estimatedHeightForRow,

    /* 
    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return 44; 
    } 
    */ 
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return UITableViewAutomaticDimension; 
    } 
    

Basta fare un tentativo, potrebbe aiutare a ottenere il problema.

+0

Grazie per l'aiuto. Ho trovato una domanda modificata con una soluzione. – OMK

+0

Cheers! Felice codifica .. –

1

Per me la soluzione era quella di impostare lo estimatedRowHeight su un valore maggiore di qualsiasi valore ritenuto possibile per i dati che dovevo visualizzare.

Per qualche motivo questo ha assicurato che la proprietà estimatedRowHeight non è stata utilizzata per determinare lo contentSize. Non visualizzo l'indicatore di scorrimento, quindi non mi importava davvero che lo estimatedRowHeight fosse lontano.

Problemi correlati