jef*_*eon 5 objective-c uitableview ios
我正在使用Xcode4编写一个简单的iOS应用,该应用使用表格视图来显示故事列表(从URL获取)。我将故事标题显示为UILabels,并显示为表格单元格的子视图。
我很想heightForRowAtIndexPath根据每个故事标题的长度为单元格计算正确的高度。我将标签添加到中的单元格中cellForRowAtIndexPath。当我在模拟器中运行该应用程序时,一切都呈现良好。但是:当我向下滚动并向上滚动时,标签变得混乱。他们被截断并超跑。我进行了一些调试,发现heightForRowAtIndexPath滚动过程中未触发该方法,因此未重新计算像元高度,因此标签文本溢出并变得难看。以下是相关代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
[cell autorelease];
}
/* NOTE: code to load trimmedTitle dynamically is snipped */
NSString* trimmedTitle;
UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [trimmedTitle sizeWithFont:cellFont constrainedToSize:constraintSize
lineBreakMode:UILineBreakModeWordWrap];
UILabel* tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, 230, labelSize.height)];
tempLabel.lineBreakMode = UILineBreakModeWordWrap;
tempLabel.text = trimmedTitle;
tempLabel.numberOfLines = 0;
[cell.contentView addSubview:tempLabel];
[tempLabel release];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* cellText; // code to load cellText dynamically is snipped off
UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0];
CGSize constraintSize = CGSizeMake(230.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height + 20;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我通常会预先计算所有行的高度,将它们存储在一个数组中,然后将这些高度返回到heightForRowAtIndexPath. 这样,表格视图就知道每个单元格的高度,并且即使在重用之后,单元格也符合该高度。除了寻找单元格何时可见并重新加载之外,我不知道还有什么方法可以强制计算单元格高度,这似乎成本太高。
更新:一些示例代码:
我有一个名为 的方法- (void)calculateHeights,它执行与 中相同的计算heightForRowAtIndexPath,但将结果存储在我的可变数组heights_ivar 中:
- (void)calculateHeights {
[heights_ removeAllObjects]
for (Widget *myWidget in modelWidgetArray) {
NSString* cellText; // code to load cellText dynamically is snipped off
UIFont *cellFont = [UIFont fontWithName:@"Georgia" size:14.0];
CGSize constraintSize = CGSizeMake(230.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
[heights_ addObject:[NSNumber numberWithFloat:labelSize.height + 20.0f]];
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 中heightForRowAtIndexPath,给定 1 节表视图:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [heights_ objectAtIndex:[indexPath row]];
}
Run Code Online (Sandbox Code Playgroud)
如果您的表格视图有多个部分,您需要做一些数学运算才能转换为一维heights_数组并再次转换回来。另外,任何时候您也-reloadData需要这样做。-calculateHeights
| 归档时间: |
|
| 查看次数: |
6333 次 |
| 最近记录: |