我正在尝试计算NSAttributedString
的边界矩形,然后将该属性字符串放入UITextView
。我想根据文本调整UITextView
的大小。我想手动计算的原因是因为此UITextView
位于UITableViewCell
,我不想在单元格高度上使用自动尺寸。
string myString = "This is some test string that should be long enough to be word wrapped";
var boldAttributes = new UIStringAttributes ();
boldAttributes.ForegroundColor = UIColor.Black;
boldAttributes.Font = AppDelegate.SegoeUIBold.WithSize (14);
var attributedString = new NSMutableAttributedString (myString, boldAttributes);
var rect = attributedString.GetBoundingRect(new CGSize(UIScreen.MainScreen.Bounds.Width - 16, 10000), NSStringDrawingOptions.UsesFontLeading|NSStringDrawingOptions.UsesLineFragmentOrigin, null);
var height = Math.Ceiling(rect.Height);
大部分时间都可以使用。但是有一些特殊情况会失败。在这种情况下,我有一串文本可以分为3行。
这是一些测试字符串,应该足够长,可以成为单词
包裹。
所以我的GetBoundingRect
应该返回足够大的3行高度。但它只能返回足够大的2行高度。我发现,如果我将UITextViews
包装更改为字符包装,一切似乎都能正常工作。所以我的字符串最终看起来像这样:
这是一些测试字符串,其长度应足以成为单词 缠绕。
我无法弄清楚如何让attributedString.GetBoundingRect()
进行自动换行而不是字符换行。任何想法?
答案 0 :(得分:-1)
尝试使用这个:
public override void ViewDidLoad ()
{
nfloat padding = 70;
nfloat tfWidth = UIScreen.MainScreen.Bounds.Width - 2 * padding;
string myString = "This is some test string that should be long enough to be word wrapped";
UILabel tf = new UILabel (new CGRect (padding,100,tfWidth,0));
tf.Text = myString;
tf.BackgroundColor = UIColor.Red;
tf.Lines = int.MaxValue;
tf.LineBreakMode = UILineBreakMode.WordWrap;
tf.Font = UIFont.SystemFontOfSize(14);
this.View.AddSubview (tf);
NSString nsStr = new NSString(myString);
nfloat height = nsStr.GetBoundingRect (
new CoreGraphics.CGSize (tfWidth,float.MaxValue),
NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
new UIStringAttributes (){Font = tf.Font},
null).Size.Height;
tf.Frame = new CGRect (tf.Frame.Location, new CGSize (tfWidth, height));
}
在UITableViewSource中,我使用以下代码:
public override nfloat GetHeightForRow (UITableView tableView, Foundation.NSIndexPath indexPath)
{
CellItem item = dataList [indexPath.Row];
NSString nsStr = new NSString(item.Message);
nfloat textWidth = item.CellWidth;
nfloat height = nsStr.GetBoundingRect (
new CoreGraphics.CGSize (textWidth,float.MaxValue),
NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
new UIStringAttributes (){Font = item.Font},
null).Size.Height;
return height;
}
如果需要,可以为每个单元格使用不同的字体。
希望它可以帮到你。