まったく同じ問題があったので、考えを追加したいと思います。
私はUITextView
それがより良いテキスト配置を持っていたので使用していました(正当化、現時点ではで利用できませんでしたUILabel
)が、non-interactive-non-scrollableを「シミュレート」するためにUILabel
、完全なスクロール、バウンス、およびユーザー操作をオフにします。
もちろん、問題はテキストが動的であり、幅が固定されていても、新しいテキスト値を設定するたびに高さが再計算されることでした。
boundingRectWithSize
私が見ることができるものから、私にはまったくうまくいきませんでした、カウントに含まれないUITextView
マージンを上に追加boundingRectWithSize
していたため、取得されboundingRectWithSize
た高さが本来よりも低くなりました。
テキストは迅速に更新されることはなかったため、2〜3秒ごとに最も頻繁に更新される可能性のあるいくつかの情報に使用されるだけなので、次のアプローチを決定しました。
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
*上記のコードは私のソースから直接コピーされていません。この記事に必要のない他の多くのものから調整/クリアする必要がありました。コピー、貼り付け、およびそれが機能する作業コードに使用しないでください。
明らかな欠点は、呼び出しごとにallocとreleaseがあることです。
しかし、利点は、あなたがboundingRectWithSizeは、テキストや計算を描画する方法間の互換性に応じて、避けることであるのサイズとにおけるテキスト描画の実装UITextView
(またはUILabel
もあなただけ置き換える使用することができますUITextView
しUILabel
)。Appleが持つ可能性のある「バグ」は、この方法で回避されます。
PSそれはあなたがこの「臨時雇用者」UITextView
を必要とするべきではないようでsizeThatFits
、ターゲットから直接尋ねることができるように思われますが、それは私にとってはうまくいきませんでした。ロジックはそれが機能するはずであると言いますが、一時のalloc / releaseはUITextView
必要ありませんが、機能しませんでした。しかし、この解決策は、私が設定するすべてのテキストに対して完璧に機能しました。
lineBreakMode
ますか?