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

Центрировать по вертикали в UILabel с автозагрузкой

Это немного отличается от всех других вопросов "Как разместить текст в UILabel" здесь...

У меня есть UILabel с некоторым текстом в нем, я хочу центрировать текст по вертикали в UILabel. Какая большая сделка, не так ли? Это значение по умолчанию. Проблема возникает из-за того, что мой текст динамичен, и у меня включен автозапуск. По мере увеличения текста размер шрифта уменьшается. Вы получаете такое поведение.

enter image description here

Обратите внимание, что базовая линия шрифта не перемещена, я хочу, чтобы она перемещалась, поэтому числа центрированы по вертикали в кадре UILabel's.

Легко, правда? Я просто помню исходный центр кадра в viewDidLoad

    self.workoutTimeCenter = _workoutTimeLabel.center;

а затем я вызываю sizeToFit после изменения текста, правильно?

    [_workoutTimeLabel sizeToFit];
    _workoutTimeLabel.center = _workoutTimeCenter;

Ну, sizeToFit сделал, я думаю, именно то, что он должен был делать, изменил размер кадра, чтобы текст не уменьшался!

enter image description here

Как я могу вертикально центрировать текст в UILabel при соблюдении базовых линий и автозапуска? (Обратите внимание, что iOS5 и более поздние решения прекрасны, и я могу даже иметь дело с iOS6 и более поздним решением.)

4b9b3361

Ответ 1

По моему опыту вы можете просто установить для свойства -[UILabel baselineAdjustment] значение UIBaselineAdjustmentAlignCenters для достижения эффекта, который вы описываете.

В docs:

baselineAdjustment

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

@property(nonatomic) UIBaselineAdjustment baselineAdjustment

Обсуждение

Если для свойства adjustsFontSizeToFitWidth установлено значение YES, это свойство контролирует поведение исходных текстов текста в ситуации, когда требуется настройка размера шрифта. По умолчанию значение этого свойства UIBaselineAdjustment AlignBaselines. Эта свойство действует только тогда, когда свойство numberOfLines установлено на 1.

и

UIBaselineAdjustmentAlignCenters
Отрегулируйте текст, основанный относительно центра его ограничивающего прямоугольника.

EDIT: добавление полного контроллера представления, который демонстрирует это:

@interface TSViewController : UIViewController
@end

@implementation TSViewController

- (void) addLabelWithFrame: (CGRect) f baselineAdjustment: (UIBaselineAdjustment) bla
{
    UILabel* label = [[UILabel alloc] initWithFrame: f];
    label.baselineAdjustment = bla;
    label.adjustsFontSizeToFitWidth = YES;
    label.font = [UIFont fontWithName: @"Courier" size: 200];
    label.text = @"00";
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor lightGrayColor];
    label.userInteractionEnabled = YES;
    [self.view addSubview: label];

    UIView* centerline = [[UIView alloc] initWithFrame: CGRectMake(f.origin.x, f.origin.y+(f.size.height/2.0), f.size.width, 1)];
    centerline.backgroundColor = [UIColor redColor];
    [self.view addSubview: centerline];

    UITapGestureRecognizer* tgr = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(onTap:)];
    [label addGestureRecognizer: tgr];
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    [self addLabelWithFrame: CGRectMake(0, 0, 320, 200)
         baselineAdjustment: UIBaselineAdjustmentAlignCenters];

    [self addLabelWithFrame: CGRectMake(0, 220, 320, 200)
         baselineAdjustment: UIBaselineAdjustmentAlignBaselines];
}

- (void) onTap: (UITapGestureRecognizer*) tgr
{
    UILabel* label = (UILabel*)tgr.view;
    NSString* t = [label.text stringByAppendingString: @":00"];
    label.text = t;
}

@end

Ответ 2

-(void)fitVerticallyToLabel:(UILabel *)lbl
{
    CGFloat fontSize = lbl.frame.size.width / lbl.text.length;
    [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];

    CGRect rect = lbl.frame;
    rect.origin.y += rect.size.height - fontSize;
    rect.size.height = fontSize;
    [lbl setFrame:rect];
}

Как использовать: вызывается этот метод после установки текста на ваш ярлык.

    label.text = @"text";
    [self fitVerticallyToLabel:label];

enter image description hereenter image description here

Примечание: я ahev взял UILabel из xib. Вы можете использовать его программно и в этом случае вам нужно будет установить его выравнивание текста NSTextAlignMentCenter

Ответ 3

Попробуйте реализовать эту логику:

-(void)adjustLabel1Text1:(NSString *)text1 
{
    UILabel *lbl_first = [UIFont fontWithName:@"Helvetica" size:12];



    text1 = [text1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


    float hedingLblHeight = [self calculateHeightOfTextFromWidth:text1 : [UIFont fontWithName:@"Helvetica" size:12] :118 :UILineBreakModeWordWrap];

    lbl_first.text=text1;


    [lbl_first setFrame:CGRectMake(lbl_first.frame.origin.x, lbl_first.frame.origin.y, 118, hedingLblHeight)];
    lbl_first.lineBreakMode = UILineBreakModeWordWrap;
    lbl_first.numberOfLines = 0;
    [lbl_first sizeToFit];




//////////Adjust the lable or any UIControl below this label accordingly.

    float endResultHeight=[self calculateHeightOfTextFromWidth:text2 : [UIFont fontWithName:@"Helvetica" size:15] :299 :UILineBreakModeWordWrap];

    if(hedingLblHeight>secondImgTitleHeight)
    {
    [lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];
    }
    else
    {
        [lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];

    }

    lbl_endResult.lineBreakMode=UILineBreakModeWordWrap;
    lbl_endResult.numberOfLines = 0;
    [lbl_endResult sizeToFit];



}

-(float) calculateHeightOfTextFromWidth:(NSString*)text : (UIFont*) withFont:(float)width :(UILineBreakMode)lineBreakMode
{

    CGSize suggestedSize = [text sizeWithFont:withFont constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:lineBreakMode];

    return suggestedSize.height;
}

Это очень помогло мне. Надеюсь, это сработает для вас.

Ответ 4

при работе в IB убедитесь, что выровняете базовые линии с центром

введите описание изображения здесь

Примечание: разрыв строки НЕ МОЖЕТ быть переносом слов, чтобы это работало, поэтому оно НЕ будет работать многострочно (полезно установить разрыв строки на хвост Truncate)

Ответ 5

Try

yourLabel.textAlignment = UITextAlignmentCenter;