Objective-C - текстовая линия в левом нижнем углу

При рисовании строки в IOS по умолчанию текст выравнивается по левому верхнему углу. Это может вызвать проблемы при использовании нескольких строк с разными размерами шрифта с одинаковыми координатами y.

Вопрос;
Как сделать базовую строку в левом нижнем углу первого ряда.

введите описание изображения здесь

Как мне этого добиться?

Br,
Тим

2 ответа

Решение

Я наконец нашел решение своей проблемы.
Вычитая свойство ascender UIFont из rect.origin.y, я могу расположить текст в нижнем левом углу.

Ссылаясь на документацию UIFont свойства ascender:

"Верхняя y-координата, смещенная от базовой линии, самого длинного восходящего элемента получателя". https://developer.apple.com/library/ios/documentation/uikit/reference/UIFont_Class/Reference/Reference.html

- (void)drawTextBaseLined:(NSString *)text
                     rect:(CGRect)rect
                     font:(UIFont *)font
{
  if ([text length] == 0) return false;

  NSDictionary *attributes = @{NSFontAttributeName : font};

  rect.origin.y -= font.ascender;
  [text drawWithRect:rect
             options:NSStringDrawingUsesLineFragmentOrigin
          attributes:attributes
             context:nil];
}

Этот метод будет работать с одной или несколькими строками текста и с разными размерами шрифта. Я надеюсь, что мое решение поможет кому-то еще.

Br,
Тим

Использование - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context;

Когда у вас есть высота вашего ярлыка, просто сделайте математику, чтобы выбрать его правильное начало, чтобы нижний левый угол всегда был в одном и том же месте.

NSDictionary * attributes = @{NSFontAttributeName:[UIFont systemFont]};

CGRect rect = [[NSString string] boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

Если вы хотите, чтобы ваша метка ниже левого угла всегда была на 50 пикселей, то источник вашей метки будет в (50 - rect.size.height).

Измените размер, чтобы приспособиться к вашим ограничениям.

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