Подтвердить что ты не робот

Как выровнять текст UILabel снизу?

Как UILabel можно выровнять снизу. Скажем, мой ярлык может содержать три строки текста. Если входной текст является отдельной строкой, то эта строка должна быть нижней частью метки. Пожалуйста, обратитесь к приведенному ниже изображению для лучшего понимания. Оранжевая область - это полный кадр метки. В настоящее время она имеет одну линию и выровнен по центру. Так что я хочу, он должен всегда выравниваться снизу, независимо от того, сколько строк.

enter image description here

Просьба предложить свои идеи.

Спасибо.

4b9b3361

Ответ 1

Вот два способа сделать это...

1. Сначала установите numberOfLines в 0, а затем используйте свойство sizeToFit для UILabel, чтобы ваш UILabel отображал его contentSize.

yourLabel.numberOfLines = 0;

[yourLabel sizeToFit];

Дополнительную информацию можно найти по этой ссылке: Вертикально выравнивать текст в UILabel

2. Другой вариант - взять UITextField вместо UILabel и установить userInteractionEnabled в NO, как показано ниже...

[yourTextField setUserInteractionEnabled:NO];

а затем установите свойство contentVerticalAlignment внизу, как показано ниже.

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];

UPDATE

Кроме того, с UITextField мы не можем достичь нескольких строк. Поэтому вместо этого мы можем использовать UITextView и установить его userInteractionEnabled в NO. Затем используйте следующий код, чтобы сделать его выровненным снизу.

CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height);
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};

Ответ 2

Подкласс UILabel

@interface Label : UILabel

@end

Затем переопределите drawTextInRect так

@implementation Label

- (void)drawTextInRect:(CGRect)rect
{
    if(alignment == top) {

        rect.size.height = [self sizeThatFits:rect.size].height;
    }

    if(alignment == bottom) {

        CGFloat height = [self sizeThatFits:rect.size].height;

        rect.origin.y += rect.size.height - height;
        rect.size.height = height;
    }

    [super drawTextInRect:rect];
}

@end

Ответ 3

i устанавливает только нижнее ограничение супер-представления в IB, которое работает для меня, не используя код, а также количество строк для максимального ограничения.

Ответ 4

Вы можете подклассифицировать UILabel и переопределить метод:

- (void)drawTextInRect:(CGRect)rect

вызов super drawTextInRect с прямоугольником, в котором вы хотите использовать.

Ответ 5

У меня была такая же проблема. Вот как я сделал, чтобы выровнять текст до нижней части моего UILabel:

- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode];

switch (vertAlign) {
    case 0: // align = top
        l.frame = CGRectMake(l.frame.origin.x,
                                   l.frame.origin.y,
                                   l.frame.size.width,
                                   stringSize.height
                                   );
        break;
    case 1: // align = bottom
        l.frame = CGRectMake(l.frame.origin.x,
                                   (l.frame.origin.y + l.frame.size.height) - stringSize.height,
                                   l.frame.size.width,
                                   stringSize.height
                                   );
        break;
    case 2: // align = middle
        // default
        break;
}

l.text = text;
}

Ах, вы просто вызываете метод, подобный этому, для выравнивания в нижней части:

[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1];

Ответ 6

Еще одна опция: используйте один ярлык для цвета фона, я называю это одним оригиналомLabel, а другой для текста, называемого textLabel в моем примере. Затем вычислите высоту и координату Y для textLabel:

[textLabel sizeToFit];
int height = textLabel.frame.size.height;
int yCoord = originalLabel.frame.origin.y + 
          originalLabel.frame.size.height - height;
textLabel.frame = CGRectMake( originalLabel.frame.origin.x, yCoord,
          textLabel.frame.size.width, height);