【问题标题】:iOS UITableView AutoSizing Cell with Section IndexiOS UITableView AutoSizing Cell with Section Index
【发布时间】:2012-09-12 17:00:33
【问题描述】:

我有一个应用程序,可以在表格视图中加载一个大型 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 的程序来获取标签宽度。

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

【问题讨论】:

  • textSize.width 和 textSize.heigth+10 是 label.frame.size
  • 然后?我的意思是这取决于我硬编码的 labelWidth 并且我希望 labelWidth 是动态确定的
  • 它将根据您的文本大小动态确定以适应uilabel。
  • 王子 对不起,我不明白你的意思。对我来说,要确定我需要使用 CGSize 的文本大小,它要求我有标签的宽度。除非我知道 sectionIndex 大小,否则我不知道这个大小。也许你可以给我一个“答案”,告诉我我将使用的代码。谢谢

标签: ios uitableview indexing cell autoresize


【解决方案1】:

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

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

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

【讨论】:

  • 好吧,没有标准的方式,这就是我的想法。对于你的想法,这是一个我没有想到的好主意。我将实施并尝试它。谢谢你的想法。顺便问一下,你知道 sectionindex 使用的是哪种系统字体吗?
  • 我会使用systemFontOfSize 并尝试一些。 (大概8个左右)
【解决方案2】:

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

我还发现在 cellForRowAtIndexPath 和 willDisplayCell 方法被调用之后才正确设置 cell.contentView.bounds,因此在这些调用期间尝试获取值注定会失败。在调用 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;
}

【讨论】:

  • 我应该指出一个警告。如果您有大量索引(超过 20 个,不确定确切数字),表索引逻辑会合并一些索引标题,并且只显示一个点来表示它们。如果最宽的标题恰好是隐藏的标题之一,那么实际宽度可能与我的代码报告的值不同,因为它不会忽略任何标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多