Нет способа установить вертикальное выравнивание на 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
, как и два других режима усечения (голова и середина). NSLineBreakByClipping
также игнорируется. NSLineBreakByCharWrapping
работает как обычно. Ширина рамки по-прежнему сужается до самой правой буквы.
Марк Эмери дал исправление для NIB и раскадровок с использованием Auto Layout в комментариях:
Если ваша метка включена в перо или раскадровку в качестве подпредставления view
ViewController, который использует autolayout, то размещение вашего вызова sizeToFit
в viewDidLoad
не будет работать, потому что размеры autoolayout и расположение subviews после вызова 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;