5

NSAttributedStringsを使用してUITableViewCellのUITextViewsから一貫した結果を取得するのに問題があります。

内部-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    headerText = [[UITextView alloc]initWithFrame:CGRectZero];
    [headerText setUserInteractionEnabled:NO];
    headerText.tag = HEADER_TEXT;
    [cell.contentView addSubview:headerText]; 
} else {
    headerText = (UITextView*)[cell.contentView viewWithTag:HEADER_TEXT];
}

//...setting up attributed strings


[headerText setAttributedText:headerString];

CGSize headerSize = [headerText sizeThatFits:CGSizeMake(246, CGFLOAT_MAX)];

headerText.frame = CGRectMake(45, 8, headerSize.width, headerSize.height);

結果:

スクロールする前にcontentinsetはありません

ご覧のとおり、最初の2つは、私が期待/希望する方法でテキストを描画しているように見えます。最後の2つでは、UITextView sizeThatFitsメソッドは、テキストを描画するために必要なサイズよりもはるかに大きいサイズを返し、テキストはフレームの上部に密着するのではなく、フレームの中央に配置されます。uitextviewフレームの高さに基づいて他のビューをレイアウトできるようにしたいので、これは問題です。

フレームからスクロールして戻った後: ここに画像の説明を入力してください

セルが再利用され、属性付きの文字列が再び設定されると、さらに奇妙になります。uitextviewは、一貫性のない方法でテキストを描画します。

contentInsetsをに設定することも

headerText.contentInset = UIEdgeInsetsMake(-8, -8, -8, -8);

一貫性のある結果は提供されません。

ここに画像の説明を入力してください

そして、contentinsetを設定してスクロールした後: ここに画像の説明を入力してください

UITextViewに、必要な動作を取得できる他の属性はありますか?

4

1 に答える 1

8

以前は別の属性文字列を持っていたUITextViewの属性文字列を設定するときは、UITextViewの文字列関連のすべてのプロパティを最初に常にnilに設定する必要があります。例:

self.tv.text = nil;
self.tv.font = nil;
self.tv.textColor = nil;
self.tv.textAlignment = NSTextAlignmentLeft;
self.tv.attributedText = s2;

そうしないと、ご存知のように、以前の属性付き文字列の古い機能が引き続き機能し、新しい属性付き文字列に影響を与えます。

ただし、一般的に、UITextViewを使用している理由がまったくわかりません。ユーザーがこれらの属性付き文字列を編集できるようにする必要がない場合は、UILabelを使用するか、属性付き文字列を直接描画して、可能な限り最も正確なレンダリングを行います。NSAttributedStringは、サイズを測定し、そのサイズ内で描画するために必要なすべての機能を提供します。

于 2013-03-02T03:49:00.020 に答える