UITableView的高度取决于其单元格

时间:2015-02-02 11:20:15

标签: objective-c xcode uitableview autolayout

我有UITableView。它的单元格包含UITextView,它们的高度是动态的。 PIC:

storyboard

如果我为UITableView高度创建约束 268 px,它是常量,并且在所有单元格后面都有可用空间。 PIC:

uitableview

没有高度限制高度变为0. pic:

我希望UITableView的高度与单元格完全匹配。

非常感谢!

2 个答案:

答案 0 :(得分:0)

要根据您需要拥有内容的内容(在您的情况下是文本)创建动态高度的行,请计算要显示的文本所需的高度。此外,如果文本大/小,您可以强制限制单元格的最大/最小高度。

表委托方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
      // calculate the height of the cell based on the size of the text required to be displayed

CGSize textViewSize = [text sizeWithFont:[UIFont fontWithName:@"Marker Felt" size:20] 
                       constrainedToSize:CGSizeMake(WIDHT_OF_VIEW, FLT_MAX) 
                       lineBreakMode:UILineBreakModeTailTruncation];
// WIDHT_OF_VIEW could be text view's width and  FLT_MAX could be 10,000

CGFloat cellHeight = 50.0f; // initialize with minimum cell height

cellHeight = cellHeight + textViewSize.height;

//you can set MAX_HEIGHT_OF_CELL
if(cellHeight > MAX_HEIGHT_OF_CELL)
{
    return MAX_HEIGHT_OF_CELL;// set the text view to scroll vertically while creating cell
    }
else
{
    return cellHeight;
}
}

同样在

中创建单元格时
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

   Cell *cell;
    ....
    ....

   CGFloat cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
   cell.textView setFrame:CGRectMake (cell.textView.frame.origin.x, cell.textView.frame.origin.y, cell.textView.frame.size.width, cellHeight - 50.0f)

...
...

return cell;
}

答案 1 :(得分:0)

我认为你想要实现的可能是一个糟糕的想法,因为你需要小心不要让UITableView比屏幕更大,否则你就不应该滚动。一个可能更好的方法是: *根据需要设置tableView的高度。 *不要在tableView中使用分隔符 *如果需要,可在细胞内包含分隔符。

使用这种方法,您将以一个没有可见额外行的表结束,这些行可以滚动到所有单元格并使用正确的布局。

如果您仍然想要计算tableView的大小与单元格相同,您可以在调用后设置框架或约束[self.tableView reloadData](取决于您是否使用autolayout)但我不鼓励这样做除非你有充分的理由这样做。

//example
-(void)viewDidLoad{
[super viewDidLoad]
[self.tableView reloadData];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// Max height is 268;
if (self.tableView.contentSize.height<=268){
//tableHeightConstraint is an IBOutlet to the height Constraint.
tableHeightConstraint.constant = self.tableView.contentSize.height;
}else{
tableHeightConstraint.constant = 268;
}
[self.view setNeedsLayout];
}