Как получить высоту строки UITextView при использовании UIStringAttributes в Xamarin Forms iOS?

У меня проблема с настройкой.

Перед установкой система по умолчанию использует шрифт Helvetica 12pt с высотой строки 13,8.

Эта высота строки кажется точной, как показано на изображении здесь:

Однако, если я установилUIStringAttributes.Fontсвойство с Arial 17pt высота строки 18,99 кажется неточной, как показано здесь:

Мой код выглядит следующим образом:

      void SetAttributes(string text)
{
  NSMutableAttributedString astr = new NSMutableAttributedString();
  UIStringAttributes attrs;
  NSAttributedString str;
  CheckBox cb;
  string[] lines;
  string line;

  lines = text.Split("\n", StringSplitOptions.None);
  for (int i = 0; i < lines.Count; i++)
  {
            cb = _checks[i];
            line = lines[i];

    if (i + 1 < _checks.Count)
      line += "\n";

    attrs = new UIStringAttributes();
    attrs.ForegroundColor = cb.Color;

    ////////////////////////////////
    //COMMENTING THIS LINE OUT ALLOWS A CORRECT
    //LINEHEIGHT TO BE GIVEN IN DRAW METHOD
    attrs.Font = Control.Font;
    ////////////////////////////////

    str = new NSAttributedString(line, attrs);

    astr.Append(str);
        }

  Control.AttributedText = astr;
}

public override void Draw(CGRect rect)
{
  double baseline = editor.Padding.Top + Control.Font.Ascender;
  double movingBaseline = baseline + BOTTOM_MARGIN;
  double scrollY = Control.ContentOffset.Y;

  double _lineHeight = Control.Font.LineHeight;

  //get graphics context
  using (CGContext g = UIGraphics.GetCurrentContext())
  {
    for (int i = 0; i < _lines.Count; i++)
    {
        CGPath path = new CGPath();

      //set up drawing attributes
      g.SetLineWidth(0.5f);
      UIColor.Black.SetStroke();

      //add lines to the touch points
      path.AddLines(new CGPoint[] { new CGPoint(0, movingBaseline - scrollY),
                  new CGPoint(300, movingBaseline - scrollY) });

      //add geometry to graphics context and draw it
      g.AddPath(path);

      g.DrawPath(CGPathDrawingMode.Stroke);

      //tying this to the control.baseline hopefully should help
      //to avoid accumulating rounding errors
      movingBaseline = baseline + BOTTOM_MARGIN + (_lineHeight * (double)(i + 1));
    }
  }


  base.Draw(rect);

}

Я пробовал:

  • 1 другой шрифт, Consolas -> высота все еще неправильная
  • NSString(text).StringSize-> дает высоту 19, что неверно
  • ПараметрParagraphStyle.LineHeightвUIStringAttributesпоэтому я могу контролировать высоту, но, к сожалению, ее нельзя установить, потому что Xamarin не реализовал сеттер

Есть идеи?

1 ответ

Я считаю, что, возможно, решил это или, по крайней мере, нашел обходной путь с помощью:

      NSMutableParagraphStyle para = new NSMutableParagraphStyle();

para.LineSpacing = LINESPACING;
attrs.ParagraphStyle = para;

Установка шрифта для атрибутов , вероятно, добавляла межстрочный интервал по умолчанию, которого я не видел. Если я сам установлю это явно, по крайней мере, я буду знать, какое значение используется, и могу рассчитать высоту строки следующим образом:

      lineHeight = Control.Font.LineHeight + LINESPACING

Кажется, это работает на данный момент. Сообщит, если снова начнет плохо себя вести.

Другие вопросы по тегам