2012-11-26 8 views
16

Also habe ich ein sehr grundlegendes Problem. Ich habe diese UITableView innerhalb einer view, und ich möchte diese Tabelle Höhe so hoch wie es sein muss, um alle Zeilen in der Tabelle anzuzeigen. Daher möchte ich nicht blättern können, ich möchte nur, dass alle Zeilen angezeigt werden. (Die Zeilen sind in der Menge dynamisch und height).Ändern Sie die Größe von UITableView so hoch, dass sie nur für den gesamten Inhalt passt

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

Wenn es 20 Zeilen sind, wird die Tabelle sehr hoch sein, aber wenn es nur 1 Zeile ist, wird es sehr klein und der andere Inhalt erscheint nicht 19 Zeilen unten.

Antwort

22

, wenn ich es richtig verstanden habe, sollten Sie für jede Zeile, die Höhe addieren können und die Tableview Höhe auf dieser Grundlage anzupassen:

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

Sie diese unmittelbar nach [Tableview reload]

tun können
+0

ich nie einen [Tableview reload] nennen. Wo soll ich das dann hinstellen? – abisson

+0

nachdem Sie fertig sind mit der Einrichtung von _stepsArray (von dem ich annehme, dass es sich um Ihre Datenquelle handelt). –

+1

Wird heightForRowAtIndexPath nicht zweimal aufgerufen? Auch ... gibt es keinen viel einfacheren Weg dies zu tun? Ich habe das Gefühl, dass ich so viele Apps gesehen habe, bei denen die Tischhöhe von der Gesamtzahl der Reihen abhängt. Vielen Dank! – abisson

4

Sie mögen diese versuchen kann,

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

6

Hier ist eine einfachere Lösung: Alles, was Sie brauchen, ist sizeToFit auf Ihrem UITableView, nachdem es mit Zellen gefüllt wurde. Wenn Sie delegate und dataSource durch xib setzen, können Sie dies in Ihrem viewDidLoad Methode oder viewDidAppear, wie folgt aus:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

Aber, wenn Sie delegate und dataSource irgendwo im Code hinzufügen, müssen Sie setzen sizeToFit nach dies:

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

    [yourTableView sizeToFit]; 
} 

Außerdem haben Sie diese nach reloadTable zu tun, wenn man das irgendwo zu tun.

Dies wird die Größe Ihres Tisches genau auf die Höhe ändern, die eine Summe seiner Zellenhöhe ist!

+0

Das ist richtig DennisWelu, ** sizeToFit ** berücksichtigt nur den Inhalt der Zeile, nicht die Leerzeichen zwischen den Zeilen. – akelec

3

einen Beobachter hinzufügen für die Content Eigenschaft auf der Tabellenansicht, und stellen Sie die Bildgröße entsprechend

In viewDidLoad die folgende Codezeile

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

dann in der Callback hinzufügen:

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

Hoffe, das wird Ihnen helfen.

0

Verwenden Sie einfach tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; Das wird Ihr Problem lösen.

0

Set eine Höhenbeschränkung auf dem Tisch, eine Verbindung zu einer Steckdose, und fügen Sie folgendes zu Ihrem View-Controller:

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