2012-11-26 3 views
16

Quindi sto riscontrando un problema molto di base. Ho questo UITableView all'interno di un view, e vorrei rendere l'altezza di questa tabella così alta come deve essere per visualizzare TUTTE le righe all'interno della tabella. Pertanto, non voglio essere in grado di scorrere, voglio solo tutte le righe da visualizzare. (Le righe sono dinamiche in quantità e height).Ridimensionare l'altezza di UITableView per essere alta quanto basta per adattare solo la dimensione del contenuto totale

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping]; 
    return cellSize.height; 
} 

Se ci sono 20 righe, la tabella sarà molto alta, ma se c'è solo 1 fila, sarà molto piccolo e l'altro contenuto non apparirà 19 righe sottostanti.

risposta

22

se ho capito bene, si dovrebbe essere in grado di aggiungere fino all'altezza per ogni riga e regolare l'altezza Tableview in base a quanto segue:

CGFloat tableHeight = 0.0f; 
for (int i = 0; i < [_stepsArray count]; i ++) { 
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
} 
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, tableHeight); 

si può fare questo subito dopo [tableView reloadData]

+0

ho mai chiamo un [tableView reloadData]. Dove dovrei metterlo allora? – abisson

+0

dopo aver impostato _stepsArray (che presumo sia la tua origine dati). –

+1

Non è heightForRowAtIndexPath che verrà chiamato due volte con quello? Inoltre ... non c'è un modo molto più semplice per farlo? Mi sembra di aver visto così tante app in cui l'altezza della tabella si basa sul numero totale di righe ..! Grazie! – abisson

4

Si può provare in questo modo,

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){ 
     NSLog(@"%f",your_tableView.contentSize.height); 
    } 
} 

In Swift 3.0

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row { 
     print("\(tableView.contentSize.height)") 
    } 
} 
6

Ecco una soluzione più semplice: tutto ciò che serve è impostare sizeToFit sul tuo UITableView, dopo che è stato popolato con celle. Se si imposta delegate e dataSource attraverso xib, è possibile farlo nel metodo viewDidLoad, o viewDidAppear, in questo modo:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

Ma, se si aggiunge delegate e dataSource da qualche parte nel codice, devi mettere sizeToFit dopo this:

- (void)someMethod 
{ 
    [yourTableView setDelegate:self]; 
    [yourTableView setDataSource:self]; 

    [yourTableView sizeToFit]; 
} 

Inoltre, è necessario eseguire questa operazione dopo la ricarica, se lo si fa da qualche parte.

Questo ridimensiona la tabella esattamente all'altezza che è una somma della sua altezza di celle!

+0

Proprio così DennisWelu, ** sizeToFit ** considererà solo il contenuto della riga, non gli spazi bianchi tra le righe. – akelec

3

Aggiungere un osservatore per la proprietà contentSize sulla vista tabella, e regolare la dimensione del frame di conseguenza

In viewDidLoad aggiungere la seguente riga di codice

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL]; 

poi nella callback:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    { 
     CGRect frame = your_tableview.frame; 
     frame.size = your_tableview.contentSize; 
     your_tableview.frame = frame; 
    } 

Spero che questo ti possa aiutare.

0

Basta usare tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; Ciò risolverà il tuo problema.

0

Impostare un vincolo di altezza sul tavolo, collegarsi a una presa di corrente, e aggiungere il seguente al vostro controller della vista:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableViewHeightContraint.constant = tableView.contentSize.height 
}