如何让StringSize返回有用的高度?

pat*_*dge 8 c# xamarin.ios ios

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 }
Run Code Online (Sandbox Code Playgroud)

是否有其他方法我应该用来找到显示任意文本块所需的高度UITextView

pat*_*dge 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 }
Run Code Online (Sandbox Code Playgroud)

forWidth超载StringSize的呼叫转移到本地sizeWithFont:forWidth:lineBreakMode: NSString方法.出于某种原因,当您使用此重载时,它将截断您的字符串以用于测量目的.

此方法返回约束为指定宽度的字符串的宽度和高度.虽然它计算会发生换行的位置,但此方法实际上并不会将文本换行到其他行.如果字符串的大小超过给定的宽度,则此方法使用指定的换行符模式截断文本(仅用于布局),直到它符合最大宽度; 然后它返回结果截断字符串的大小.

关于UITextView填充的注意事项

作为旁注,使用UITextView带有返回的StringSize将导致需要滚动查看(UITextView继承自UIScrollView)的文本,因为它包含一些强制内容填充.您还需要调整内容偏移量以获得预期效果.

someUITextView.ContentInset = new UIEdgeInsets(-8, -8, -8, -8);
Run Code Online (Sandbox Code Playgroud)