Игнорировать Ascender и Descender при центрировании UILabel по вертикали?

Я использую AutoLayout для размещения некоторых меток в вертикальном центре ячейки. Текст находится во всех шапках, но рассматриваемый UILabel , даже когда применяется sizeToFit , оставляет место под текстом, что очень похоже на хвосты на таких буквах, как нижний регистр y, p и q , Поскольку я центрируюсь вертикально, это вызывает смещение и означает, что текст появляется на несколько пикселей выше, чем он должен делать.

Другой вопрос может быть: могу ли я шрифт разумно настроить свой вертикальный центр в зависимости от того, содержит ли он какие-либо символы, которые используют зажим или спусковой механизм?

Например, строка «abbaba» не нуждается в descender, тогда как строка «oyyoyo» не нуждается в восходящем. Строки во всех шапках также никогда не нуждаются в спусковом устройстве. Если я вертикально центрирую «oyyoyoyo», он будет казаться слишком низким.

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

3 Solutions collect form web for “Игнорировать Ascender и Descender при центрировании UILabel по вертикали?”

Спасибо, Абхинит , за ваш ответ.

Я также искал это, поэтому я хотел бы разместить здесь точные ограничения, которые необходимо применить для выравнивания текстов по своему вкусу.

Этот образ из Википедии показывает различные разделы размера шрифта.

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

Таким образом, существует много способов выровнять метку в зависимости от того, хотите ли вы выровнять высоту ролика, высоту шапки, высоту x, базовую линию или высоту спуска.

Допустим, у вас есть label содержащий текст в кепках типа «HELLO», и вы хотите выровнять его с viewAbove чтобы viewAbove высоту и выровнять с viewBelow до базовой линии.

Вы бы сделали:

 let font = label.font let ascenderDelta = font.ascender - font.capHeight LayoutHelper() .addViews([ "label":label, "viewAbove":viewAbove, "viewBelow":viewBelow ]) .withMetrics(["ascenderDelta":ascenderDelta]) .addConstraints([ // -- Here the constraints to align to cap height -- "X:label.top == viewAbove.bottom - ascenderDelta", "X:label.baseline == viewBelow.top", ...other constraints... ]) 

Примечание: в примере я использую мой класс утилиты LayoutHelper , но я надеюсь, что идея понятна.

О знаке «авто-выравнивание»:

Я подумаю о создании «умного» ярлыка, который подстраивается под соответствующую строку, в зависимости от того, содержит ли она десендеры, подшивки, кепки и т. Д.

Вы можете сделать это, используя отрицательные вставки в drawTextInRect (например, здесь, но, например, используя insets = {-ascenderDelta, 0, font.descender, 0} ). Но это может повредить любые восходящие / спусковые механизмы на случай, если у вас есть. Я предпочел бы выровнять с шапками без обрезки любого возможного зажима.

Вы можете использовать свойства «capHeight» и «xHeight» в UIFont, чтобы получить правильную высоту и использовать ее для определения размера UILabel.

Конечно, это предполагает, что вы точно знаете, будет ли строка иметь строчные или прописные буквы. Если нет, то вы можете переопределить setText на UILabel и проверять каждый раз, когда функция вызывается.

Я бы также подумал о том, чтобы глубже проникнуть в CoreText и реализовать что-то вроде этого http://www.zsiegel.com/2012/10/23/Core-Text-Calculating-line-heights/

У меня была та же проблема, и я решил ее подклассифицировать UILabel и изменить метод рисования:

 - (void)drawRect:(CGRect)rect { CGRect capCenteredRect = CGRectMake(rect.origin.x, (self.font.leading-self.font.capHeight)*0.5f, rect.size.width, rect.size.height); [super drawTextInRect:capCenteredRect]; } 

В моем случае мне нужно было сосредоточиться на кепках, потому что вертикальное центрирование UILabel всегда отходит на несколько пикселей. Если вам нужно центрировать вертикально на строчные буквы с помощью descender, вы можете изменить прямоугольник на:

 CGRectMake(rect.origin.x, (self.font.leading-self.font.xHeight)*0.5f+self.font.descender, rect.size.width, rect.size.height) 
  • Как создать inputAccessoryView с помощью автоматического макета?
  • Многолинейный UILabel iOS AutoLayout
  • Регулярное / регулярное расстояние между представлениями для всех iPad и iPad Pro?
  • Как AutoLayout кнопки в контроллере uiview в iphone?
  • многострочный UILabel с использованием AttributedText с помощью lineSpacing добавляет нежелательное смещение на iphone 6+ и 7+
  • UICollectionViewCell с AutoLayout, не работающим в iOS 10
  • Обновите предпочтительнуюMaxLayoutWidth для многострочного UILabel с неизвестным размером (Auto Layout)
  • Анимация высоты UILabel с автозапуском
  • Кадр не сбрасывается после предоставления ограничения uiview, iOS
  • Автоопределение UILabel в UITableViewCell
  • Авто макет = ViewWillAppear имеет неправильную ширину представления
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.