正如我的标题所说,我想根据细胞数设置UITableView
的框架。单元格UITableView
的高度是动态的,它不是固定的,为此,我应用我的以下逻辑
注意:我在
UITableView
添加了UIScrollView
,因此可以轻松滚动/查看整个表格的内容。我知道UITableView
有自己的scrollView,但在我的项目中,我需要根据单元格数量(单元格的动态高度)设置UITableView
的高度。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self adjustHeightOfTableview]; // custom method for set height of tableView
}
- (void)adjustHeightOfTableview
{
CGRect frame = self.tblView.frame;
frame.size.height = tblHeight; // tblHeight is CGFloat, declare in .h file
self.tblView.frame = frame;
self.scrollView.contentSize = CGSizeMake(300, self.tblView.frame.origin.y + self.tblView.frame.size.height);
}
从
获取- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%d", indexPath.row);
NSString *AnswerHeight = [[self.listOfQuestions objectAtIndex:indexPath.row] objectForKey:@"Answer"]; // get
CGSize constraint = CGSizeMake(queWidth - (10.0f * 2), 20000.0f);
CGSize size = [AnswerHeight sizeWithFont:[UIFont fontWithName:@"OpenSans-Bold" size:12] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 52);
tblHeight = tblHeight + height + (10.0f * 2) - 1.5; // set tblHeight
return height + (10.0f * 2) - 1.5;
}
但问题是heightForRowAtIndexPath
调用了2次,因此我无法获得正确的 tblHeight ,因此我的tableView的高度设置不正确。
为什么我heightForRowAtIndexPath
拨打2次电话或者我如何解决我的问题?或者set tableView的框架的任何其他解决方案基于动态的单元格数
只是为了理解
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
答案 0 :(得分:1)
heightForRowAtIndexPath 将调用可见的每一行。
您可以在viewDidAppear或ViewWillApearMethod中计算表格高度。
for (int i =0 ; i < self.listOfQuestions.count; i++) {
NSString *AnswerHeight = [[self.listOfQuestions objectAtIndex:i] objectForKey:@"Answer"]; // get
CGSize constraint = CGSizeMake(queWidth - (10.0f * 2), 20000.0f);
CGSize size = [AnswerHeight sizeWithFont:[UIFont fontWithName:@"OpenSans-Bold" size:12] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 52);
tblHeight = tblHeight + height + (10.0f * 2) - 1.5; // set tblHeight
}
检查我更新的答案
答案 1 :(得分:1)
每一行都会在可见行中出现时调用heightForRowAtIndexPath,因此解决方案非常简单。
创建一个NSMutableArray,其行数作为表视图,然后每次计算行的高度时,只需使用该行的高度更改该indexPath行的索引。
无论何时你想要表的高度,只需要对所有数组的行求和,就应该这样做。
如果您有任何更多说明,请询问(Y)
答案 2 :(得分:1)
为什么不做空 footerView 。
UIView *footerView=[[UIView alloc]initWithFrame:CGRectZero];
self.taskListTable.tableFooterView=footerView;
然后更改您认为它将更改的表格框架:
比如viewWillApear
或任何你的行动
self.taskListTable.frame= CGRectMake(0,0, 320, self.view.bounds.size.height);