it-swarm.com.ru

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

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

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

enter image description here

25
Mrwolfy

В iOS нет способа установить вертикальное выравнивание UILabel по умолчанию. Вместо этого вы захотите использовать один из методов sizeWithFont, предоставляемых NSString. Какой вы используете, зависит от того, хотите ли вы многострочную или однострочную метку. sizeWithFont:forWidth:lineBreakMode: можно использовать для однострочных меток, а sizeWithFont:constrainedToSize:lineBreakMode: можно использовать для многострочных меток. Вы можете легко загрузить параметр шрифта с помощью свойства font рассматриваемой метки. Вы можете посмотреть здесь для более подробной информации об использовании этих функций.

Эти методы будут возвращать структуру CGSize с минимальным размером для вашей метки на основе текста в NSString. Как только у вас будет правильный размер для ярлыка, вы можете легко разместить его в верхней части суперпредставления, и он будет выровнен по верху.

9
Paul O.

Для этого есть обходной путь:

  1. Установите высоту и ширину constraint для вашего UILabel с константой <= на максимальную высоту | ширину, которую вы хотите.
  2. Установите number of lines в ноль.
  3. Установите высоту в storyboard, чтобы она занимала только одну строку.
  4. В вашем коде после установки текста UILabel вызовите sizeToFit.

Это позволит вашему UILabel изменять размеры в пределах максимальной ширины и высоты, которую вы хотите, и текст всегда будет выровнен по верху.

26
AboulEinein

Я использовал ответ, связанный выше с Неван Кинг в комментарии к моему вопросу: Вертикально выровняйте текст по верху внутри 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

12
Mrwolfy

Я заменил UILabel на UITextView, потому что в UITextView текст прилипает к вершине.

Просто предложение, это может быть полезно для кого-то. 

6
WebOrCode

Сделать подкласс UILabel 

.h файл

@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment;

.m файл

- (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];
}

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

1
Wodjefer

Существует простое решение для случаев, когда высота метки не обязательно должна быть постоянной: поместите свой Label в Stack View. Обязательно добавьте ведущие и конечные константы в Stack View. Вот скриншот того, как это сделать в раскадровке:

 enter image description here

1
Alexander Poleschuk

В моем приложении я установил для свойства линии UILabel значение 0, а также для создания нижнего ограничения UILabel и убедился, что для него установлено значение> = 0, как показано на рисунке ниже.

 enter image description here

0
Jack