【问题标题】:Center vertically in UILabel with autoshrink使用自动收缩在 UILabel 中垂直居中
【发布时间】:2013-08-01 01:49:51
【问题描述】:

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

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

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

很简单,对吧?我只记得框架的原始中心在viewDidLoad

    self.workoutTimeCenter = _workoutTimeLabel.center;

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

    [_workoutTimeLabel sizeToFit];
    _workoutTimeLabel.center = _workoutTimeCenter;

嗯,sizeToFit 做了,我猜,正是它应该做的,调整框架的大小,使文本适合而不缩小!

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

【问题讨论】:

  • 您以编程方式或在 xib 文件上创建标签。
  • 我已经在xib中建立了标签
  • 如何将您的 UILabel 嵌入到更大的 UIView 中,然后使用 label.center = FatherView.center 将 UILabel 居中在 UIView simpy 中; ?
  • 我没有遵循,基线仍然不会居中。
  • @PaulCezanne 你能解释一下吗?你的要求是像我的回答一样吗?我对基线和字体大小感到困惑。

标签: ios uilabel


【解决方案1】:

在 IB 中工作时,请务必将基线对齐到中心

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

【讨论】:

  • 最优雅的解决方案!
【解决方案2】:

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

来自docs:

基线调整

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

@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

【讨论】:

  • +1 这是正确的方法。许多答案试图手动计算框架,但这很简单。它适用于 iOS 2.0 及更高版本。
  • 它在我的测试应用程序中工作。你能创建一个简单的测试用例来探查它吗?或者我可以发布我的。
  • 似乎使用adjustsLetterSpacingToFitWidth 会破坏baselineAdjustment。我在任何地方都没有看到这个记录;可能值得向 Apple 提交雷达错误。我会这样做的。
  • @TomSwift 如果可以的话,我会为这个答案投票 10000 次。谢谢!
  • 另外,请确保 lineBreakMode 不是“自动换行”
【解决方案3】:
-(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

【讨论】:

    【解决方案4】:

    尝试实现这个逻辑:

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

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

    【讨论】:

      【解决方案5】:

      试试

      yourLabel.textAlignment = UITextAlignmentCenter;
      

      【讨论】:

      • 使用 'NSTextAlignmentCenter' 定位 iOS6!
      • 这不是他要问的。
      • 水平居中而不是垂直居中
      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多