2

我有一个应用程序,我在表格视图中加载一个大的 plist 文件。这个 plist 文件就像一本书。它包含章节和行。每行都有不同的长度,具体取决于行长,因此我需要自动调整单元格的大小。

我正在使用情节提要和标准表格视图和单元格。单元格样式=基本,单元格标签设置为 text=plain lines=0 linebreaks=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 来获取标签宽度。

或者任何其他应该允许它是动态的并且不再是静态硬编码的。

4

2 回答 2

1

不幸的是,没有(标准)方法可以直接访问部分索引子视图。但是,您可以使用计算CGSize文本的方法来动态确定节索引的宽度。

您可以预先确定要返回的所有可能的字符串sectionIndexTitlesForTableView:并计算必要的大小,也许左右填充一些额外的像素。也许有必要做一些实验来确定正确的字体和大小。

现在你的方法screenSize.width - textSize.width - 2*PADDING应该是可行的。现在唯一硬编码的东西是填充,当引入新的屏幕尺寸时它不应该破坏东西。

于 2012-09-20T10:54:09.373 回答
1

好的,为了节省其他人几个小时的工作......我费力地测试了各种字体、大小和边距,将它们与带有索引的实际表视图的 UIView 层次结构转储进行比较,以达到这个方法,它将返回表格索引的宽度,以便表格视图单元格内容的边界可以计算为 table_width - index_width。我要指出的是,通常还有另外 20 像素的右侧留给附件视图。

我还发现 cell.contentView.bounds 直到在 cellForRowAtIndexPath 和 willDisplayCell 方法被调用之后才正确设置,因此在这些调用期间尝试获取值注定会失败。它在调用 viewDidAppear 时正确设置。

如果设备语言设置为非英文字母,我不知道如何计算索引宽度。

- (CGFloat) getMaxIndexViewWidth
{
    CGFloat indexMargin = 21.0;   
    NSArray *sectionTitles = [self sectionIndexTitlesForTableView:nil];  //NOTE -- if multiple tables, pass real one in

    CGFloat maxWidth11 = CGFLOAT_MIN;

    for(NSString *title in sectionTitles)
    {
        CGFloat titleWidth11 = [title sizeWithFont:[UIFont  fontWithName:@"Helvetica-Bold" size:11.0f]].width;
        maxWidth11 = MAX(maxWidth11, titleWidth11);     
    }
    return maxWidth11+indexMargin;
}
于 2013-04-25T16:39:04.813 回答