У меня есть UILabel
место для двух строк текста. Иногда, когда текст слишком короткий, этот текст отображается в вертикальном центре метки.
Как выровнять текст по вертикали, чтобы он всегда был вверху UILabel
?
источник
У меня есть UILabel
место для двух строк текста. Иногда, когда текст слишком короткий, этот текст отображается в вертикальном центре метки.
Как выровнять текст по вертикали, чтобы он всегда был вверху UILabel
?
Там нет никакого способа установить вертикальное выравнивание на UILabel
Невозможно , но вы можете получить тот же эффект, изменив рамку метки. Я сделал свои ярлыки оранжевыми, чтобы вы могли ясно видеть, что происходит.
Вот быстрый и простой способ сделать это:
[myLabel sizeToFit];
Если у вас есть метка с более длинным текстом, который будет занимать более одной строки, установите numberOfLines
значение 0
(ноль здесь означает неограниченное количество строк).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
Более длинная версия
Я сделаю свою метку в коде, чтобы вы могли видеть, что происходит. Вы можете настроить большую часть этого в Интерфейсном Разработчике также. Моя установка представляет собой приложение на основе вида с фоновым изображением, которое я сделал в Photoshop для отображения полей (20 баллов). Этикетка имеет привлекательный оранжевый цвет, поэтому вы можете видеть, что происходит с размерами.
- (void)viewDidLoad
{
[super viewDidLoad];
// 20 point top and left margin. Sized to leave 20 pt at right.
CGRect labelFrame = CGRectMake(20, 20, 280, 150);
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
[myLabel setBackgroundColor:[UIColor orangeColor]];
NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
[myLabel setText:labelText];
// Tell the label to use an unlimited number of lines
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
[self.view addSubview:myLabel];
}
Некоторые ограничения использования sizeToFit
вступают в игру с текстом по центру или по правому краю. Вот что происходит:
// myLabel.textAlignment = NSTextAlignmentRight;
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
Ярлык по-прежнему имеет фиксированный верхний левый угол. Вы можете сохранить ширину оригинальной метки в переменной и установить ее после sizeToFit
или задать фиксированную ширину, чтобы противостоять этим проблемам:
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
CGRect myFrame = myLabel.frame;
// Resize the frame's width to 280 (320 - margins)
// width could also be myOriginalLabelFrame.size.width
myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
myLabel.frame = myFrame;
Обратите внимание, что sizeToFit
будет учитываться минимальная ширина вашей первоначальной метки. Если вы начнете с метки шириной 100 и призовете sizeToFit
ее, она вернет вам (возможно, очень высокий) ярлык шириной 100 (или чуть меньше). Возможно, вы захотите установить метку на минимальную ширину, которую вы хотите, перед изменением размера.
Некоторые другие вещи, чтобы отметить:
Уважение lineBreakMode
зависит от того, как оно установлено. NSLineBreakByTruncatingTail
(по умолчанию) игнорируется после sizeToFit
, как и два других режима усечения (head и middle). NSLineBreakByClipping
также игнорируется. NSLineBreakByCharWrapping
работает как обычно. Ширина рамки все еще сужена, чтобы соответствовать самой правой букве.
Марк Эмери дал исправление для NIB и раскадровок, используя Auto Layout в комментариях:
Если ваша метка включена в перо или раскадровку в качестве
view
подпредставления ViewController, который использует autolayout, тоsizeToFit
вызов вашего вызоваviewDidLoad
не будет работать, потому что размеры autoolayout и положение подпредставлений после вызоваviewDidLoad
вызываются и сразу же отменяют эффекты вашегоsizeToFit
вызов. Однако звонкиsizeToFit
изнутриviewDidLayoutSubviews
будут работать.
При этом используется NSString
метод sizeWithFont:constrainedToSize:lineBreakMode:
для расчета высоты кадра, необходимой для размещения строки, а затем задается источник и ширина.
Измените размер рамки для метки, используя текст, который вы хотите вставить. Таким образом, вы можете разместить любое количество строк.
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
constrainedToSize:maximumSize
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;
adjustsFontSizeToFitWidth
используйте sizeToFit, затем установите для фрейма метки значение 0, 0, theWidthYouWant, label.frame.size.height (это новая высота, определяемая sizeToFit). Затем применитеadjustsFontSizeToFitWidth
Установите новый текст:
Установите
maximum number
количество строк в 0 (автоматически):Установите рамку этикетки на максимальный размер:
Позвоните,
sizeToFit
чтобы уменьшить размер фрейма, чтобы содержимое просто поместилось:Рамка для надписей теперь достаточно высокая и достаточно широкая, чтобы вместить ваш текст. Верхний левый должен быть неизменным. Я проверял это только с выравниванием по верхнему левому краю текста. Для других выравниваний вам, возможно, придется изменить кадр позже.
Кроме того, на моем ярлыке включена перенос слов.
источник
Ссылаясь на решение расширения:
следует заменить на
В каждой добавленной новой строке необходимо дополнительное место, потому что
UILabels
возврат каретки в iPhone, похоже, игнорируется :(Аналогично, alignBottom также должен быть обновлен с использованием
@" \n@%"
вместо вместо"\n@%"
(для инициализации цикла нужно заменить также на «for (int i = 0 ...»).У меня работает следующее расширение:
Затем звоните
[yourLabel alignTop];
или[yourLabel alignBottom];
после каждого назначения текста yourLabel.источник
VerticalAlign
между скобками после@implementation UILabel
. Будучи новичком в Objective-C, я не сталкивался с этим синтаксисом раньше. Как это называется?sizeWithFont:constrainedToSize:lineBreakMode:
и sizeWithFont: оба устарели в iOS7. Кроме того, эта категория работает только для меток, когда numberOfLines больше 0.На всякий случай, если это кому-нибудь поможет, у меня возникла та же проблема, но я смог решить ее, просто переключившись с использования
UILabel
на использованиеUITextView
. Я ценю это не для всех, потому что функциональность немного отличается.Если вы переключитесь на использование
UITextView
, вы можете отключить все свойства просмотра прокрутки, а также включить взаимодействие с пользователем ... Это заставит его работать больше как ярлык.источник
UITextView
дало мне желаемый результат.Нет суеты, нет суеты
Без суеты, без Objective-c, без суеты, кроме Swift 3:
Swift 4.2
источник
Как и в ответе выше, но это было не совсем правильно, или просто вставлять в код, поэтому я немного его исправил. Добавьте это расширение либо в собственный файл .h и .m, либо просто вставьте прямо над реализацией, которую вы намереваетесь использовать:
А затем, чтобы использовать, поместите ваш текст в метку, а затем вызовите соответствующий метод, чтобы выровнять его:
или
источник
Еще более быстрый (и более грязный) способ сделать это - установить для режима прерывания строки UILabel значение «Клип» и добавить фиксированное количество новых строк.
Это решение не будет работать для всех - в частности, если вы все еще хотите показывать «...» в конце вашей строки, если оно превышает количество отображаемых строк, вам нужно использовать одну из более длинные фрагменты кода - но во многих случаях это даст вам то, что вам нужно.
источник
UILineBreakModeWordWrap
вместо этого.Самый простой подход с использованием раскадровки:
Вставить метку в StackView и набор следующих двух атрибутов StackView в Attribute Inspector:
1-
Axis
доHorizontal
,2-
Alignment
доTop
источник
UILabel
в некоторыйUIView
подкласс (UIView
обычно достаточно простого ) и позволить этой метке расти в направлении вниз. Спасибо!UILabel
и позволить StackView делать свою работу. Спасибо!Вместо этого
UILabel
вы можете использоватьUITextField
вариант с вертикальным выравниванием:источник
Я долго боролся с этим и хотел поделиться своим решением.
Это даст вам
UILabel
автоматическое сжатие текста до 0,5 масштаба и вертикальное центрирование текста. Эти опции также доступны в раскадровке / IB.источник
Создать новый класс
LabelTopAlign
.h файл
.m файл
редактировать
Вот более простая реализация, которая делает то же самое:
источник
sizeToFit
решений , это фактически делаетUILabel
положить любой текст в верхней части, даже если вы динамически заменить более короткий текст с более одной или наоборот.В Интерфейсном Разработчике
UILabel
размер максимально возможного текстаLines
в '0' в Инспекторе АтрибутовВ вашем коде
sizeToFit
на свой лейблФрагмент кода:
источник
Для Adaptive UI (iOS8 или более поздняя версия) вертикальное выравнивание UILabel должно быть установлено из StoryBoard путем изменения свойств
noOfLines
= 0` иОтредактировано:
и следующих ограничений достаточно для достижения желаемых результатов.
источник
Создайте подкласс UILabel. Работает как шарм:
Как обсуждено здесь .
источник
Я написал утилиту для достижения этой цели. Вы можете посмотреть:
.Как пользоваться? (Если lblHello создан Интерфейсным Разработчиком, поэтому я пропущу некоторые детали атрибутов UILabel)
Я также написал это в своем блоге как статью: http://fstoke.me/blog/?p=2819
источник
Я потратил некоторое время, чтобы прочитать код, а также код на введенной странице, и обнаружил, что все они пытаются изменить размер кадра метки, чтобы по умолчанию вертикальное выравнивание по центру не появлялось.
Однако в некоторых случаях мы хотим, чтобы метка занимала все эти пробелы, даже если метка имеет так много текста (например, несколько строк с одинаковой высотой).
Здесь я использовал альтернативный способ ее решения, просто добавив новые строки до конца метки (пожалуйста, обратите внимание, что я на самом деле унаследовал
UILabel
, но это не обязательно):источник
В моем приложении я установил для свойства линии UILabel значение 0, а также для создания нижнего ограничения UILabel и убедитесь, что для него установлено значение> = 0, как показано на рисунке ниже.
источник
Я взял предложения здесь и создал представление, которое может обернуть UILabel, измерить его и установить количество строк, чтобы оно было выровнено по верху. Проще говоря, UILabel в качестве подпредставления:
источник
Вы можете использовать TTTAttributedLabel , он поддерживает вертикальное выравнивание.
источник
Я обнаружил, что ответы на этот вопрос сейчас немного устарели, поэтому добавлю их для поклонников автоматического макета.
Авто макет делает этот вопрос довольно тривиальным. Предполагая, что мы добавляем метку
UIView *view
, следующий код выполнит это:Высота метки будет рассчитана автоматически (с использованием ее
intrinsicContentSize
), и метка будет располагаться от края до края горизонтально вверхуview
.источник
Я использовал много методов выше, и просто хочу добавить быстрый и грязный подход, который я использовал:
Убедитесь, что количество новых строк в строке приведет к тому, что любой текст заполнит доступное вертикальное пространство, и настройте UILabel для усечения любого переполненного текста.
Потому что иногда достаточно хорошо, достаточно хорошо .
источник
UITextView
это то, что он может вызыватьdlopen
для поддержки ввода текста. Это может вызвать серьезную задержку в потоке пользовательского интерфейса, поэтому этот подход намного эффективнее!Я хотел иметь метку, которая могла бы иметь несколько строк, минимальный размер шрифта и центрироваться как по горизонтали, так и по вертикали в родительском представлении. Я добавил мой ярлык программно на мой взгляд:
А потом, когда я хотел изменить текст моего ярлыка ...
Надеюсь, что это помогает кому-то!
источник
FXLabel (на github) делает это из коробки, установив
label.contentMode
вUIViewContentModeTop
. Этот компонент сделан не мной, но это компонент, который я часто использую, имеет множество функций и, кажется, работает хорошо.источник
для тех, кто читает это, потому что текст внутри вашего ярлыка не центрирован по вертикали, имейте в виду, что некоторые типы шрифтов не разработаны одинаково. например, если вы создадите метку с размером zapfino 16, вы увидите, что текст не идеально отцентрирован по вертикали.
тем не менее, работа с helvetica будет центрировать ваш текст по вертикали.
источник
Использование
textRect(forBounds:limitedToNumberOfLines:)
.источник
Подкласс UILabel и ограничить рисование прямоугольника, как это:
Я попробовал решение, включающее заполнение новой строки и столкнулся с неправильным поведением в некоторых случаях. По моему опыту, проще ограничить рисование прямоугольника, как указано выше, чем связываться с ним
numberOfLines
.PS Вы можете легко представить поддержку UIViewContentMode следующим образом:
источник
Если вы используете autolayout, установите для вертикального contentHuggingPriority значение 1000 в коде или IB. В IB вам, возможно, придется удалить ограничение высоты, установив приоритет 1 и затем удалив его.
источник
Пока вы не выполняете никаких сложных задач, вы можете использовать
UITextView
вместоUILabels
.Отключить прокрутку.
Если вы хотите, чтобы текст отображался полностью, просто пользователь
sizeToFit
иsizeThatFits:
методыисточник
Быстро,
let myLabel : UILabel!
Чтобы текст вашего ярлыка соответствовал размеру экрана, он находится сверху
myLabel.sizeToFit()
Чтобы ваш шрифт метки соответствовал ширине экрана или конкретному размеру ширины.
myLabel.adjustsFontSizeToFitWidth = YES
и немного textAlignment для метки:
myLabel.textAlignment = .center
myLabel.textAlignment = .left
myLabel.textAlignment = .right
myLabel.textAlignment = .Natural
myLabel.textAlignment = .Justified
источник
[myLabel sizeToFit]
. Спасибо!Это старое решение, используйте автоматическое расположение на iOS> = 6
Мое решение:
источник