Игнорировать 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) 
  • iOS autolayout изменяет ведущее и конечное пространство
  • Где добавить код ограничения topLayoutGuide
  • iOS 8 sizeThatFits для текста UITextView, не возвращающего правильную высоту (AutoLayout)
  • Как добавить ограничение на пользовательский файл xib-файла в виде таблицы?
  • Просмотр центра по оси y, когда контроллер просмотра встроен в контроллер навигации
  • Изменение масштаба при автоматической компоновке Включить, указать проблему
  • Горизонтальный центр UILabel + UIImageView внутри UIView с автозапуском
  • Модифицировать ограничения AutoLayout
  • Предупреждение о времени выполнения, когда ограничения сжатия / сжатия содержимого конфликтуют с определенными ограничениями ширины и высоты
  • iOS Различные размеры шрифта в одном классе для разных устройств
  • Обновление XIB для iPhone5 для работы с iPhone6 ​​и iPhone6 ​​Plus
  • Interesting Posts

    Не удается обновить Xcode 4.2. Ошибка: обратитесь за дополнительной информацией к var / log / install.log?

    Как вы можете использовать фильтры Core Image для настройки контрастности или резкости?

    UICollectionView с двумя заголовками

    Как получить данные VCF с контактными изображениями с помощью данных CNContactVCardSerializationWithContacts: method?

    При покупке приложения в iOS внезапно перестает работать (произошел код ошибки = 5002)

    Сравнение NSDate, вычисление «количества полуночи между» в конкретном (местном) часовом поясе

    iOS SDK: воспроизведение музыки на заднем плане и переключение просмотров

    Изменение заголовка панели управления UIPrintInteractionController

    Как установить другой вектор гравитации для разных предметов гравитационного поведения?

    Как написать вывод AUGraph в файл?

    Рендеринг CIImage в текстуру OpenGL ES 2.0 на iOS

    У iOS-разработчика есть встроенный шрифт с фиксированной шириной?

    Cocoapods – Скрыть реализацию?

    Как интегрировать функциональность навигации Microsoft Bing Map для iPhone?

    Невозможно вызвать 'dataTaskWithRequest' с помощью списка аргументов типа '(NSMutableURLRequest, (_, _, _) throws -> _)'

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.