53

这与此处的所有其他“如何将文本居中UILabel”问题略有不同...

我有一个UILabel包含一些文本的文本,我想将文本垂直居中在UILabel. 有什么大不了的,对吧?这是默认设置。问题来了,因为我的文本是动态的,并且我打开了自动收缩功能。随着文本变大,字体大小会缩小。你得到这种行为。

在此处输入图像描述

请注意,字体基线没有移动,我希望它移动,以便数字在UILabel's框架中垂直居中。

容易,对吧?我只记得框架的原始中心viewDidLoad

    self.workoutTimeCenter = _workoutTimeLabel.center;

然后我sizeToFit在更改文本后打电话,对吗?

    [_workoutTimeLabel sizeToFit];
    _workoutTimeLabel.center = _workoutTimeCenter;

好吧,sizeToFit我猜,确实是它应该做的,调整框架的大小,使文本适合而不会缩小!

在此处输入图像描述

如何UILabel在尊重基线和自动收缩的同时垂直居中文本?(注意,iOS5和更高版本的解决方案很好,我什至可以处理iOS6和更高版本的解决方案。)

4

5 回答 5

114

根据我的经验,您只需将-[UILabel baselineAdjustment]属性设置为UIBaselineAdjustmentAlignCenters即可达到您所描述的效果。

文档

基线调整

控制当文本需要缩小以适合标签时如何调整文本基线。

@property(nonatomic) UIBaselineAdjustment baselineAdjustment

讨论

如果该adjustsFontSizeToFitWidth属性设置为YES,则此属性在需要调整字体大小的情况下控制文本基线的行为。此属性的默认值为UIBaselineAdjustmentAlignBaselines。该属性仅在该numberOfLines属性设置为 时有效1

UIBaselineAdjustmentAlignCenters
相对于其边界框的中心调整文本。

编辑:添加一个完整的视图控制器来演示这一点:

@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
于 2013-08-06T18:20:47.927 回答
13

在 IB 中工作时,请务必将 align baselines 设置为 center

在此处输入图像描述

注意:换行不能是自动换行,所以它不能在多行中工作(最好将换行设置为 Truncate tail)

于 2017-03-01T15:47:56.137 回答
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];

在此处输入图像描述在此处输入图像描述

注意:我从 xib 中获取了 UILabel。您也可以以编程方式使用它,在这种情况下,您必须设置其文本对齐方式 NSTextAlignMentCenter

于 2013-08-06T10:36:12.193 回答
1

尝试实现这个逻辑:

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

它对我帮助很大。希望它对你有用。

于 2013-08-06T09:43:40.117 回答
-5

尝试

yourLabel.textAlignment = UITextAlignmentCenter;
于 2013-07-31T13:48:41.447 回答