2012-11-26 7 views
16

Mam więc bardzo podstawowy problem. Mam to UITableView wewnątrz view i chciałbym, aby wysokość tego stołu była tak wysoka, jak to konieczne, aby wyświetlić WSZYSTKIE wiersze w tabeli. Dlatego nie chcę móc przewijać, chcę tylko, aby wszystkie wiersze się pojawiły. (Wiersze są dynamiczne w liczbie i height).Zmień rozmiar wysokości UITableView tak, aby zmieściła się tylko całkowita wielkość zawartości.

-(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; 
} 

Jeśli są rzędy 20, tabela może być bardzo duży, a jeśli jest tylko jeden rząd, to będzie bardzo małe i innych materiałów nie pojawi się poniżej 19 rzędów.

Odpowiedz

22

jeśli rozumiem go poprawnie, powinieneś być w stanie dodać wysokość dla każdego wiersza i wyregulować wysokość Tableview oparciu o które:

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); 

Można to zrobić bezpośrednio po [tableView reloadData]

+0

nigdy nazywam [Tableview reloadData]. Gdzie powinienem to wtedy umieścić? – abisson

+0

po zakończeniu ustawiania _stepsArray (który zakładam, że jest twoim źródłem danych). –

+1

Czy heightForRowAtIndexPath nie będzie wywoływany dwukrotnie z tym? Również ... czy nie ma o wiele prostszego sposobu na zrobienie tego? Wydaje mi się, że widziałem już wiele aplikacji, w których wysokość tabeli zależy od całkowitej liczby wierszy ...! Dzięki! – abisson

4

można spróbować tak,

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

W 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

Oto prostsze rozwiązanie: wystarczy ustawić sizeToFit na swoim UITableView po wypełnieniu komórek. Jeśli ustawisz delegate i dataSource przez xib, można to zrobić w sposób viewDidLoad lub viewDidAppear, tak:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

Ale jeśli dodać delegate i dataSource gdzieś w kodzie, musisz umieścić sizeToFit po to:

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

    [yourTableView sizeToFit]; 
} 

Musisz też to zrobić po ponownym załadowaniu, jeśli gdzieś to zrobisz.

Spowoduje to zmianę rozmiaru twojego stołu dokładnie na wysokość, która jest sumą jego wysokości komórek!

+0

Zgadza się DennisWelu, ** sizeToFit ** uwzględnia tylko zawartość wiersza, a nie odstępy między wierszami. – akelec

3

Dodaj obserwatora dla właściwości contentSize na widoku tabeli i dostosować rozmiar ramki odpowiednio

W viewDidLoad dodać następujący wiersz kodu

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

następnie w zwrotnego:

- (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; 
    } 

Mam nadzieję, że to ci pomoże.

0

Po prostu użyj tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; To rozwiąże twój problem.

0

Ustaw ograniczenie wysokości na stole, podłączyć do gniazdka, a następnie dodaj następujące do kontrolera widoku:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableViewHeightContraint.constant = tableView.contentSize.height 
} 
Powiązane problemy