UILabel垂直居中,自动收缩

Pau*_*nne 47 uilabel ios

这与其他所有内容略有不同"我如何将文本置于中心UILabel"这里的问题......

我有UILabel一些文本,我希望将文本垂直居中UILabel.有什么大不了的,对吧?这是默认值.问题来了,因为我的文字是动态的,我打开了自动收缩.随着文本变大,字体大小缩小.你得到这种行为.

在此输入图像描述

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

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

    self.workoutTimeCenter = _workoutTimeLabel.center;
Run Code Online (Sandbox Code Playgroud)

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

    [_workoutTimeLabel sizeToFit];
    _workoutTimeLabel.center = _workoutTimeCenter;
Run Code Online (Sandbox Code Playgroud)

嗯,sizeToFit我猜,确切地说它应该做什么,调整框架的大小,使文字适合而不缩小!

在此输入图像描述

如何在一段UILabel时间内将文本垂直居中,并遵循基线和自动收缩?(注意,iOS5及更高版本的解决方案很好,我甚至可以处理iOS6及更高版本的解决方案.)

Tom*_*ift 96

根据我的经验,您可以设置-[UILabel baselineAdjustment]属性UIBaselineAdjustmentAlignCenters以达到您描述的效果.

来自文档:

baselineAdjustment

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

@property(nonatomic) UIBaselineAdjustment baselineAdjustment
Run Code Online (Sandbox Code Playgroud)

讨论

如果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
Run Code Online (Sandbox Code Playgroud)

  • 另外,确保lineBreakMode不是"Word Wrap" (7认同)
  • 似乎使用adjustsLetterSpacingToFitWidth打破了baselineAdjustment.我没有在任何地方看到这个记录; 可能应该向Apple提出雷达漏洞.我会去做的. (2认同)

Pet*_*isu 5

在IB中工作时,请确保将基线对准中心

在此处输入图片说明

注意:换行符不能自动换行,因此不能用于多行(将换行符设置为Truncate tail很好)