2012-11-26 42 views
16

因此,我有一個非常基本的問題。我在view內有UITableView,我想讓這個表的高度達到它需要顯示錶中所有行的高度。因此,我不想滾動,我只想要顯示所有行。 (這些行在數量上是動態的,並且height)。將UITableView的高度調整爲其所需的高度僅適合總內容大小

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

如果有20行,該表將是非常高的,但是如果只有1列,這將是非常小的,其他內容將不會出現低於19行。

回答

22

,如果我理解正確的話,你應該能加起來的高度的每一行,並據此調整了的tableview高度:的tableView reloadData]

後立即

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

你可以這樣做

+0

我從來沒有叫[的tableView reloadData]。那我應該把這個放在哪裏? – abisson

+0

完成設置_stepsArray(我假設你的數據源)後。 –

+1

是不是heightForRowAtIndexPath會被調用兩次?另外...是不是有一個更簡單的方法來做到這一點?我覺得我已經看到很多應用程序,桌子的高度是根據總行數計算的。謝謝! – abisson

4

你可以嘗試這樣的,

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

雨燕3.0

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

這裏是更簡單的解決方案:您需要的是在您的UITableView上設置sizeToFit,之後它已被填充單元格。如果設置delegatedataSource通過xib,你可以做到這一點在你的viewDidLoad方法,或viewDidAppear,像這樣:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

但是,如果你在代碼中添加delegatedataSource的地方,你必須把sizeToFit後這個:

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

    [yourTableView sizeToFit]; 
} 

此外,你必須在reloadTable之後做到這一點,如果你這樣做的地方。

這將調整你的桌子的高度,這是它的細胞高度的總和!

+0

這是正確的DennisWelu,** sizeToFit **將只考慮行的內容,而不是行之間的空格。 – akelec

3

添加觀察者對錶格視圖中的contentSize屬性,並調整幀的大小相應地

在viewDidLoad中添加下面的代碼行

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

然後在回調:

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

希望這會幫助你。

0

只需使用tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 這將解決您的問題。

0

設置表上的高度約束,連接到插座,並添加以下到您的視圖控制器:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableViewHeightContraint.constant = tableView.contentSize.height 
} 
相關問題