2

テーブルビューに大きなplistファイルをロードするアプリがあります。このplistファイルは本としてのものです。章と行が含まれています。各行の長さは行の長さによって異なるため、セルのサイズを自動的に変更する必要があります。

ストーリーボードと標準のテーブルビューとセルを使用しています。セルstyle=basicで、セルラベルは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 ピクセルの右側の量が予約されていることが多いことを指摘します。

また、 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;
}
于 2013-04-25T16:39:04.813 に答える