我有一个UILabel,它有两行文字的空间。有时,当文本太短时,此文本会显示在标签的垂直中心。

如何垂直对齐文本,使其始终位于UILabel的顶部?


当前回答

(截至2018年3月7日)

斯威夫特4

let maxFrameHeight = 75

myLabel = UILabel()
myLabel.frame = CGRect(x: 9, y: 9, width: 126, height: maxFrameHeight)
myLabel.text = "my labels text displayed"
myLabel.numberOfLines = 0

myLabel.sizeToFit()
let newFrameHeight = myLabel.frame.size.height
let safeNewHeight = min(newFrameHeight, maxFrameHeight)

myLabel.frame = CGRect(x: 9, y: 9, width: 126, height: safeNewHeight)

这将获得所需的结果,并确保UILabel的新高度不会超过您希望的该标签的特定最大高度。

其他回答

如果可以选择创建自己的自定义视图,可以执行以下操作:

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;
    [self.textColor set];
    [self.text drawInRect:bounds
                 withFont:self.font
            lineBreakMode:UILineBreakModeTailTruncation
                alignment:self.textAlignment];
}

我重复了戴莱辛的建议,并添加了一个UIEdgeInset,以允许调整边距。周围环境不错。

- (id)init
{
    if (self = [super init]) {
        contentEdgeInsets = UIEdgeInsetsZero;
    }

    return self;
}

- (void)layoutSubviews
{
    CGRect localBounds = self.bounds;
    localBounds = CGRectMake(MAX(0, localBounds.origin.x + contentEdgeInsets.left), 
                             MAX(0, localBounds.origin.y + contentEdgeInsets.top), 
                             MIN(localBounds.size.width, localBounds.size.width - (contentEdgeInsets.left + contentEdgeInsets.right)), 
                             MIN(localBounds.size.height, localBounds.size.height - (contentEdgeInsets.top + contentEdgeInsets.bottom)));

    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:[UILabel class]]) {
            UILabel *label = (UILabel*)subview;
            CGSize lineSize = [label.text sizeWithFont:label.font];
            CGSize sizeForText = [label.text sizeWithFont:label.font constrainedToSize:localBounds.size lineBreakMode:label.lineBreakMode];

            NSInteger numberOfLines = ceilf(sizeForText.height/lineSize.height);

            label.numberOfLines = numberOfLines;
            label.frame = CGRectMake(MAX(0, contentEdgeInsets.left), MAX(0, contentEdgeInsets.top), localBounds.size.width, MIN(localBounds.size.height, lineSize.height * numberOfLines)); 
        }
    }
}

对于那些因为标签中的文本不是垂直居中而阅读本文的人,请记住,某些字体类型的设计并不相同。例如,如果您创建一个zapfino大小为16的标签,您将看到文本没有完全垂直居中。

然而,使用helvetica会使文本垂直居中。

这个问题的简单解决方案。。。

在标签下方放置UIStackView。

然后使用“自动布局”将标签的垂直间距设置为零,并将标签的顶部约束为之前的底部。标签不会增长,stackView会增长。我喜欢的是堆栈视图是非渲染的。所以它并没有真正浪费渲染时间。即使它进行自动布局计算。

你可能需要玩“拥抱内容”和“抵抗”,但这也很简单。

我时不时地搜索这个问题,然后回到这里。这一次我有一个我认为最简单的想法,我不认为这是糟糕的表现。我必须说,我只是在使用自动布局,并不想麻烦计算帧。那只是。。。讨厌。

只要不执行任何复杂任务,就可以使用UITextView而不是UILabels。

禁用滚动。

如果希望文本完全显示,只需使用sizeToFit和sizeThatFits:methods