Выровненный по вертикали UILabel, сделайте текстовую надпись в верхней части ярлыка -ios
Есть ли способ "выровнять верх" UILabel, то есть сделать текст в верхней части надписи? В отличие от центра, выровненного по вертикали или плавающего в центре представления, как и по умолчанию?
Вот изображение трех ярлыков, выровненных влево, вправо и в центре, и UITextView, который выровнен по центру и сверху. Текст textView придерживается вершины, независимо от вертикального размера представления. Могу ли я сделать то же самое с меткой?
Ответы
Ответ 1
Невозможно установить вертикальное выравнивание UILabel
по умолчанию в iOS. Вместо этого вы захотите использовать один из методов sizeWithFont
, предоставленный NSString
. Какой из них вы используете, зависит от того, хотите ли вы использовать многострочный или однострочный ярлык. sizeWithFont:forWidth:lineBreakMode:
может использоваться для однострочных меток, а sizeWithFont:constrainedToSize:lineBreakMode:
- для многострочных меток. Вы можете легко загрузить параметр шрифта с помощью свойства font
соответствующей метки. Вы можете посмотреть здесь для получения более подробной информации об использовании этих функций.
Эти методы вернут структуру CGSize
с минимальным размером для вашей метки на основе текста в NSString
. Если у вас есть правильный размер для ярлыка, вы можете легко разместить его в верхней части своего супервизора, и он будет отображаться в верхней части.
Ответ 2
Там обходной путь:
- Установите высоту и ширину
constraint
на UILabel
с нужной константой <= до максимальной высоты.
- Установите
number of lines
в ноль.
- Задайте высоту в
storyboard
, чтобы она соответствовала только одной строке.
- В коде после установки текста вызова
UILabel
sizeToFit
.
Это приведет к изменению размера UILabel
в пределах максимальной ширины и высоты, которую вы хотите, и текст всегда будет выровнен по высоте.
Ответ 3
Я использовал ответ, связанный выше, от nevan king в комментарии к моему вопросу: Вертикально выравнивать текст вверху в пределах UILabel
Используемый мной код:
- (void)setUILabelTextWithVerticalAlignTop:(NSString *)theText {
CGSize labelSize = CGSizeMake(250, 300);
CGSize theStringSize = [theText sizeWithFont:targetLabel.font constrainedToSize:labelSize lineBreakMode:targetLabel.lineBreakMode];
targetLabel.frame = CGRectMake(targetLabel.frame.origin.x, targetLabel.frame.origin.y, theStringSize.width, theStringSize.height);
targetLabel.text = theText;
}
//linked to a button that sets the text from a UITextView to the label.
- (IBAction)setText:(id)sender {
[sourceText resignFirstResponder];
[self setUILabelTextWithVerticalAlignTop:sourceText.text];
[targetLabel setNumberOfLines:0];
[targetLabel sizeToFit];
}
Вот проект:
owolf.net/uploads/StackOverflow/verticalAlignUILabel.zip
Ответ 4
Я заменил UILabel на UITextView, потому что в UITextView текст прикрепляется к вершине.
Просто предложение, это может быть полезно для кого-то.
Ответ 5
Существует простое решение для случаев, когда высота метки не обязательно должна быть постоянной: поставьте Label
в Stack View
. Не забудьте добавить указатели на начало и конец в Stack View
.
Вот скриншот о том, как это сделать в раскадровке:
Ответ 6
Сделать подкласс UILabel
.h файл
@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment;
.m file
- (void) drawTextInRect:(CGRect)rect
{
if(_verticalAlignment == UIControlContentVerticalAlignmentTop || _verticalAlignment == UIControlContentVerticalAlignmentBottom)
{
// If one line, we can just use the lineHeight, faster than querying sizeThatFits
const CGFloat height = floorf(((self.numberOfLines == 1) ? ceilf(self.font.lineHeight) : [self sizeThatFits:self.frame.size].height));
rect.origin.y = floorf(((self.frame.size.height - height) / 2.0f) * ((_verticalAlignment == UIControlContentVerticalAlignmentTop) ? -1.0f : 1.0f));
}
[super drawTextInRect:rect];
}
- (void) setVerticalAlignment:(UIControlContentVerticalAlignment)newVerticalAlignment
{
_verticalAlignment = newVerticalAlignment;
[self setNeedsDisplay];
}
Я использовал это для вертикального выравнивания.