5

NSAttributedStringsを使用してUITableViewCellのUITextViewsから一貫した結果を得ることができません。UITableViewCellのUITextViewでNSAttributedStringを一貫して描画する方法

インサイド - (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); 

結果:

Before Scrolling No contentinset

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

スクロールした後のフレームのうち、バックで: enter image description here

は、今では、細胞が再利用されていても、見知らぬ人を、取得、および帰属文字列が再設定されています。 uitextviewはテキストを矛盾した方法で描画します。

enter image description here

そしてcontentinsetセットをスクロールした後:

でも

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

にcontentInsetsを設定すると、一貫性のある結果の任意の並べ替えを提供していません enter image description here

は、他のありますUITextViewの属性を使用すると、動作を取得できます私が必要とする?

答えて

8

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

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

を以前に帰属された文字列の古い機能が引き続きハングアップし、新しい帰属文字列に影響を与えます。

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

+0

私はUITextInputプロトコルを実装しているため、UITextViewを使用しています。これにより、テキストの特定の部分文字列にボタンを作成することができます。私はテキストを直接描くことが好ましいだろうと認めます。それを達成するためにiOSライブラリを調べる必要がありますか?質問に答えてくれてありがとう。 –

+0

テキストを描画するのに "ライブラリ"は必要ありません。それはUIKitの一部です。 – matt

+0

私はCoreTextを使用して、タッチが与えられた行またはテキストの行の上に来たかどうかを判断する必要があるかもしれないと思う。 –

関連する問題