NSAttributedString GetBoundingRect使用字符换行而不是自动换行

时间:2016-08-05 12:53:02

标签: xamarin xamarin.ios nsattributedstring

我正在尝试计算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()进行自动换行而不是字符换行。任何想法?

1 个答案:

答案 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;
    }

如果需要,可以为每个单元格使用不同的字体。

希望它可以帮到你。