gpt4 book ai didi

ios - 未调用 TableView 动态行高

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:08:56 24 4
gpt4 key购买 nike

我有一个应用程序显示一个 TableView,顶部有两个相对静态的单元格,后面是一系列包含标签和分段控件的自定义单元格。这些单元格需要根据标签中文本的数量改变高度。

我在 cellForRowAtIndexPath 中计算所需的单元格高度,将值存储在数组中,然后在 heightForRowAtIndexPath 中使用该数组中的值。但是,似乎首先调用了 heightForRowAtIndexPath,因此我所有的行高都是 0/nil。

当需要在配置单元格之前知道单元格高度时,如何根据单元格的特定内容指定行高?

来自 cellForRowAtIndexPath 的片段:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger currentIndex = indexPath.item;
if (indexPath.item == 0){
static NSString *CellIdentifier = @"MeasurementCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
[self.cellHeightList insertObject:[NSNumber numberWithInt:44] atIndex:currentIndex];
return cell;
} else if (indexPath.item == 1){
if (self.dataController.isScoreAvailable){
static NSString *CellIdentifier = @"ScoreCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
[self.cellHeightList insertObject:[NSNumber numberWithInt:46] atIndex:currentIndex];
return cell;
} else {
static NSString *CellIdentifier = @"ScoreCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone;
[self.cellHeightList insertObject:[NSNumber numberWithInt:0] atIndex:currentIndex];
return cell;
}
} else if (indexPath.item > 1){
NSInteger labelWidth = [UIScreen mainScreen].applicationFrame.size.width - 140; //80 for segment + 3*20 for margins & spacing
CGSize maxSize = CGSizeMake(labelWidth, MAXFLOAT);
CGSize labelSize;

static NSString *CellIdentifier = @"QuestionCell";
InterviewQuestionCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
InterviewQuestion *questionAtIndex = [self.dataController objectInListAtIndex:(indexPath.item-2)];
cell.questionLabel.text = questionAtIndex.questionText;
labelSize = [cell.questionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:maxSize lineBreakMode:NSLineBreakByWordWrapping];
CGRect labelFrame = CGRectMake(0, 0, labelWidth, labelSize.height);
cell.questionLabel.frame = labelFrame;
cell.questionLabel.numberOfLines = 0;
cell.answerControl.selectedSegmentIndex = questionAtIndex.answer;
cell.answerControl.tag = indexPath.item;
[self.cellHeightList insertObject:[NSNumber numberWithInt:labelSize.height] atIndex:currentIndex];
return cell;
}
return nil;
}

来自 heightForRowAtIndexPath 的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger currentIndex = indexPath.item;
return [[self.cellHeightList objectAtIndex:currentIndex] integerValue];
}

谢谢!

最佳答案

首先确保您没有在 indexPath 上使用“item”,而是使用“row”。我认为 UICollectionView 使用 Item,而不是 UITableView。其次,您需要以某种方式在手头没有单元格的情况下计算单元格的大小。您的 tableView 具有一定的宽度,因此您可以基于此计算出必要的高度。将此计算放在 heightForRowAtIndexPath: 中:(如果这是密集的,请将其缓存)。

具体来说,将以下代码放在 heightForRowAtIndexPath 中而不是 cellForRowAtIndexPath 中:

NSInteger labelWidth = [UIScreen mainScreen].applicationFrame.size.width - 140;
CGSize maxSize = CGSizeMake(labelWidth, MAXFLOAT);
CGSize labelSize;

此外,不使用 UIScreen,只需使用 tableView 的宽度,它可以降低您的代码的耦合度。

关于ios - 未调用 TableView 动态行高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com