Выровненный по вертикали UILabel, сделайте текстовую надпись в верхней части ярлыка -ios

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

Вот изображение трех ярлыков, выровненных влево, вправо и в центре, и UITextView, который выровнен по центру и сверху. Текст textView придерживается вершины, независимо от вертикального размера представления. Могу ли я сделать то же самое с меткой?

enter image description here

Ответ 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];
}

Я использовал это для вертикального выравнивания.