UITableView框架基于单元格数量

时间:2013-11-19 06:41:17

标签: ios iphone objective-c cocoa-touch uitableview

正如我的标题所说,我想根据细胞数设置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;
}

3 个答案:

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