如何从底部对齐UILabel文本?

时间:2013-08-15 07:15:44

标签: iphone ios alignment uilabel

UILabel如何从底部对齐。比方说,我的标签可以容纳三行文字。如果输入文字是单行,那么这行应该在标签的底部。请参考下面的图片以便更好地理解。橙色区域是标签的完整框架。目前它有一条线,它对齐中心。所以我想要的是,不管有多少行,它都应该始终对齐。

enter image description here

请提出您的想法。

谢谢。

11 个答案:

答案 0 :(得分:22)

这有两种方法......

1。首先将numberOfLines设置为0,然后使用sizeToFit的{​​{1}}属性,以便UILabel显示UILabel }。

contentSize

从此链接中查看更多信息:Vertically align text within a UILabel

2。另一种选择是取yourLabel.numberOfLines = 0; [yourLabel sizeToFit]; 而不是UITextField并将UILabel设置为userInteractionEnabled,如下所示......

NO

然后将[yourTextField setUserInteractionEnabled:NO]; 属性设置为底部,如下所示......

contentVerticalAlignment

<强>更新

此外,使用[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; ,我们无法实现多行。因此,我们可以使用UITextField并将其UITextView设置为userInteractionEnabled。然后,使用下面的代码使其底部对齐。

NO

答案 1 :(得分:19)

子类UILabel

@interface Label : UILabel

@end

然后像这样覆盖drawTextInRect

@implementation Label

- (void)drawTextInRect:(CGRect)rect
{
    if(alignment == top) {

        rect.size.height = [self sizeThatFits:rect.size].height;
    }

    if(alignment == bottom) {

        CGFloat height = [self sizeThatFits:rect.size].height;

        rect.origin.y += rect.size.height - height;
        rect.size.height = height;
    }

    [super drawTextInRect:rect];
}

@end

答案 2 :(得分:7)

使用contentMode属性设置顶部和底部的Swift 4.2版本:

class VerticalAlignedLabel: UILabel {

    override func drawText(in rect: CGRect) {
        var newRect = rect
        switch contentMode {
        case .top:
            newRect.size.height = sizeThatFits(rect.size).height
        case .bottom:
            let height = sizeThatFits(rect.size).height
            newRect.origin.y += rect.size.height - height
            newRect.size.height = height
        default:
            ()
        }

        super.drawText(in: newRect)
    }
}

然后设置你的标签:

let label: VerticalAlignedLabel = UILabel()
label.contentMode = .bottom

答案 3 :(得分:3)

我只为IB中的超级视图设置了一个底部约束,它对我有用而不使用代码和最大约束的行数。

答案 4 :(得分:0)

我有同样的问题。以下是我将文本与UILabel底部对齐的方法:

- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode];

switch (vertAlign) {
    case 0: // align = top
        l.frame = CGRectMake(l.frame.origin.x,
                                   l.frame.origin.y,
                                   l.frame.size.width,
                                   stringSize.height
                                   );
        break;
    case 1: // align = bottom
        l.frame = CGRectMake(l.frame.origin.x,
                                   (l.frame.origin.y + l.frame.size.height) - stringSize.height,
                                   l.frame.size.width,
                                   stringSize.height
                                   );
        break;
    case 2: // align = middle
        // default
        break;
}

l.text = text;
}

啊,你简单地调用这样的方法来对齐底部:

[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1];

答案 5 :(得分:0)

另一种选择:为你的背景颜色使用一个标签,我将其称为originalLabel,将另一个标签称为文本,在我的示例中称为textLabel。然后计算textLabel的高度和Y坐标:

[textLabel sizeToFit];
int height = textLabel.frame.size.height;
int yCoord = originalLabel.frame.origin.y + 
          originalLabel.frame.size.height - height;
textLabel.frame = CGRectMake( originalLabel.frame.origin.x, yCoord,
          textLabel.frame.size.width, height);

答案 6 :(得分:0)

在IB中,如@Tobe所说,超级视图的底部约束应该起作用, 如果您有多个子视图或水平堆栈视图,且其中一个元素具有底部约束,则使用“布局边距”固定为底部小于其他边距 enter image description here

答案 7 :(得分:0)

我最近遇到了这个问题,并且能够通过将标签本身放在stackview中来解决它。我从这个post那里得到了一个想法,这个问题具有相同的问题,但是带有多个标签。单个标签可以使用相同的技术。

stackview的坐标轴=水平方向,对齐方式=底部(这就是窍门)。

我的标签现在已完全对准底部,这正是我所需要的。

答案 8 :(得分:0)

  1. 使用自动布局)
textLabel.numberOfLines = 0
textLabel.textAlignment = .center

textLabel.topAnchor.constraint(greaterThanOrEqualTo: sView.topAnchor).isActive = true
textLabel.leadingAnchor.constraint(equalTo: sView.leadingAnchor).isActive = true
textLabel.trailingAnchor.constraint(equalTo: sView.trailingAnchor).isActive = true
textLabel.bottomAnchor.constraint(equalTo: sView.bottomAnchor).isActive = true

答案 9 :(得分:0)

将您的 UILabel 放在一个垂直的 UIStackView 中,并使用一个虚拟视图作为间隔。 此外,将虚拟视图设​​置为较低的拥抱和压缩优先级。

从上到下:

  • 标签
  • 虚拟视图

自下而上:

  • 虚拟视图
  • 标签

Screenshot

答案 10 :(得分:-1)

您可以继承UILabel并覆盖该方法:

- (void)drawTextInRect:(CGRect)rect

使用您要使用的矩形调用超级drawTextInRect