8

MonoTouch はsizeWithFontを通じてメソッドを利用できるようにしますが、渡した文字列の長さに関係なくUIView、フォントを返すようです。LineHeight

string someString = "test string";
UIFont someFont = UIFont.SystemFontOfSize(13f);
SizeF sizeToDisplay = someUIView.StringSize(someString, someFont, Bounds.Width, UILineBreakMode.WordWrap);
// sizeToDisplay = { Width: 58, Height = 16 }
someString = string.Join(" ", Enumerable.Repeat(someString, 500));
sizeToDisplay = someUIView.StringSize(someString, someFont, Bounds.Width, UILineBreakMode.WordWrap);
// sizeToDisplay = { Width: 304, Height = 16 }

テキストの任意のブロックを表示するために必要な高さを見つけるために使用する必要がある他の方法はありますUITextViewか?

4

1 に答える 1

9

これは MonoTouchに固有のものではありませんが、その答えを見つけるにはネイティブNSString.sizeWithFontメソッドを検索する必要があるため、これは将来他の MonoTouch 開発者に役立つはずです。

なんらかの理由で、幅の値の代わりに完全な引数を取る の別のオーバーロードStringSizeをヒットする必要があります。SizeFこの場合、非常に大きな高さで「ハック」して、ラップされたテキストのサイズを取得します。

SizeF sizeToDisplay = someUIView.StringSize(someString, someFont, new SizeF(Bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
// For the larger string: sizeToDisplay = { Width: 307, Height = 1600 }

ネイティブメソッドへ呼び出しforWidthのオーバーロード。何らかの理由で、このオーバーロードを使用すると、測定のために文字列が切り捨てられます。StringSizesizeWithFont:forWidth:lineBreakMode: NSString

このメソッドは、指定された幅に制限された文字列の幅と高さを返します。このメソッドは改行が発生する場所を計算しますが、実際にはテキストを追加の行に折り返すわけではありません。文字列のサイズが指定された幅を超える場合、このメソッドは、指定された改行モードを使用して、最大幅に収まるまでテキストを切り捨てます (レイアウト目的のみ)。次に、結果の切り捨てられた文字列のサイズを返します。

UITextView パディングに関する注意

補足として、UITextView返された で a を使用すると、強制的なコンテンツ パディングが含まれているためStringSize、テキストをスクロールして表示する必要があります (UITextView継承元)。期待どおりの結果を得るには、コンテンツ オフセットUIScrollViewも微調整する必要があります。

someUITextView.ContentInset = new UIEdgeInsets(-8, -8, -8, -8);
于 2013-01-14T19:21:42.313 に答える