调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?

Posted

技术标签:

【中文标题】调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?【英文标题】:How can I centre both vertically and horizontally in a UILabel after resizing the text to fit width (1 line label)? 【发布时间】:2015-06-21 19:27:38 【问题描述】:

这真的让我很沮丧。我注意到有很多关于这个的问题,但我似乎无法让它发挥作用。我试过 UILabel。我已经尝试过 UITextField (它在一定程度上有效,但如果文本太多,一些文本不会一直调整大小)。我尝试将标签模拟为 UIButton。我无法得到任何东西来产生我想要的效果。我已将 UILabel 的背景颜色设置为红色,以了解其位置。请记住,我希望 UILabel 的框架保持这个大小和位置。如果使用 UITextField 或 UIButton 更容易(也许我没有以正确的方式做到这一点),我不反对将它们用作解决方案。

从上图中可以看出,在我的红色 UILabels 中,文本正在调整以正确适应宽度并且水平居中,但它也没有垂直居中(我想要)。这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    else
        [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];


    UILabel *numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, 60, 40)];
    numberLabel.font = [UIFont boldSystemFontOfSize:30];
    numberLabel.adjustsFontSizeToFitWidth = true;
    numberLabel.textAlignment = NSTextAlignmentCenter;
    [numberLabel setBackgroundColor:[UIColor redColor]];


    UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 0, self.tableView.frame.size.width-numberLabel.frame.size.width-55, 40)];
    nameLabel.font = [UIFont boldSystemFontOfSize:20];
    nameLabel.adjustsFontSizeToFitWidth = true;
    nameLabel.textAlignment = NSTextAlignmentCenter;
    [nameLabel setBackgroundColor:[UIColor yellowColor]];


    if(indexPath.section == 0) // Weekday
    
        numberLabel.text = weekdayBusesNumbers[indexPath.row];
        nameLabel.text = weekdayBusesNames[indexPath.row];
    

    else if(indexPath.section == 1) // Saturday
    
        numberLabel.text = saturdayBusesNumbers[indexPath.row];
        nameLabel.text = saturdayBusesNames[indexPath.row];
    

    else if(indexPath.section == 2) // Sunday
    
        numberLabel.text = sundayBusesNumbers[indexPath.row];
        nameLabel.text = sundayBusesNames[indexPath.row];
    


    [cell.contentView addSubview:numberLabel];
    [cell.contentView addSubview:nameLabel];


    return cell;

【问题讨论】:

【参考方案1】:

您将标签设置为单行标签(默认情况下)并将其高度设置为固定高度,从而固定其位置:

UILabel *numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, 60, 40)];

因此,无论字体大小如何,您都会为所有标签获得一个恒定的基线位置。因此,无论该字母有多高,每个字母都从相同的基线升起。

改为使用约束。将标签的垂直中心约束到单元格的垂直中心,给它一个固定的宽度和一个固定的左边缘,并允许单元格随着它的内容改变它自己的高度,并且(因此)它的字体大小改变。

您可以在标签后面放置一个红色矩形,这样用户将无法分辨标签和红色矩形之间的区别。因此,文本将垂直居中显示在红色矩形中,这就是您想要的效果。

【讨论】:

当然,在我看来,更好的外观是所有标签都具有相同的字体大小 - 大概是容纳您将要使用的最大文本量所需的大小放在那里。我认为你所拥有的红色标签文本的大小看起来真的很糟糕。然后你一开始就不会遇到这个问题。目前,你的结果很糟糕,因为你的设计很糟糕。 我猜你是对的,它可以看起来更好。谢谢。

以上是关于调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?的主要内容,如果未能解决你的问题,请参考以下文章

如何调整标签大小以适应任何屏幕尺寸

如何自动调整标签大小以适应固定宽度的容器?

如何在 swift ui 中调整形状以适应文本视图的长度和宽度

如何在 Swift 中以编程方式调整 UIButton 中文本的字体大小以适应宽度?

如何调整 TextField() 文本的大小以适应 Expanded() 小部件的最大宽度

自动调整 UILabel 文本大小以适应 UILabel 宽度