Как получить высоту строки 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
Кажется, это работает на данный момент. Сообщит, если снова начнет плохо себя вести.