我有一个应用程序,可以在表格 View 中加载一个大的 plist 文件。该 plist 文件是一本书。它包含章节和行。每行的长度根据行的长度而不同,因此我需要自动调整单元格的大小。
我正在使用 Storyboard和标准表格 View 和单元格。单元格style=基本并且单元格标签设置为text=plainlines=0linebreaks=wordwrap
到目前为止,将单元格高度调整到适当的大小没有问题。由于单元格高度是在文本插入标签之前定义的,因此我们必须通过众所周知的使用 CGsize 的方法来完成它,我就是这样做的(工作正常)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:
(NSIndexPath*)indexPath
{
NSUInteger section = [indexPath section];
NSString *key = [chapters objectAtIndex:section];
NSArray *linesSection = [lines objectForKey:key];
NSString* theText = [linesSection objectAtIndex:indexPath.row];
int labelWidth = LW_CHAPTERINDEX_10;
if (chapters.count < 100){
if (chapters.count < NB_MIN_CHAP){
labelWidth = LABELWIDTH;
} else {
labelWidth = LW_CHAPTERINDEX_10;
}
}
CGSize textSize = [theText sizeWithFont:[UIFont systemFontOfSize:14]
constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT)
lineBreakMode:UILineBreakModeWordWrap];
return textSize.height;
}
问题是根据索引进行硬编码。目前我有 3 种可能性。
- 没有索引
- 数字低于 10 的索引
- 数字低于 100 的索引
在代码中这部分
int labelWidth = LW_CHAPTERINDEX_10;
if (chapters.count < 100){
if (chapters.count < NB_MIN_CHAP){
labelWidth = LABELWIDTH;
} else {
labelWidth = LW_CHAPTERINDEX_10;
}
}
是根据 3 种可能性进行硬编码。
我发现这样做很奇怪,特别是如果苹果将开始提供更多不同的屏幕尺寸。
问题
如何在运行时获取索引宽度以确定我的标签宽度?
例如,我想编写类似 screen.width - index-width 的程序来获取标签宽度。
或者任何其他应该允许它是动态的并且不再静态硬编码的。
最佳答案
不幸的是,没有(标准)方法可以直接访问部分索引 subview 。但是,您可以使用计算文本的 CGSize
的方法来动态确定节索引的宽度。
您可以预先确定 sectionIndexTitlesForTableView:
返回的所有可能的字符串,并计算必要的大小,也许可以在左右填充一些额外的像素。也许有必要做一些实验来确定正确的字体和大小。
现在您使用诸如 screenSize.width - textSize.width - 2*PADDING
之类的方法应该是可行的。现在唯一的硬编码是填充,当引入新的屏幕尺寸时,它不应该破坏东西。
关于iOS UITableView 自动调整单元格大小并带有部分索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12510750/