21

我在 iOS7 上使用自动布局,但遇到这样的问题:

我正在将 UILabel 放到 UIView 上,并且正在安排我的自动布局约束,以便标签的 centerX = 父视图的 centerX。我没有对标签施加任何宽度限制。当我在运行时设置标签的文本时,标签的绘制宽度刚好足以容纳文本,左右两侧没有边距/填充。我想要的是在左侧和右侧有一些填充,这样文本就不会从标签开始的地方开始。实现这一点的技巧可能是将文本设置为@“文本”,但当然这不是要走的路:)

我怎样才能达到我想要的?

4

4 回答 4

34

您可以自行扩展 UILabel 并覆盖intrinsicContentSize。请确保您也设置了 textAlignment = NSTextAlignmentCenter。

-(CGSize)intrinsicContentSize{
    CGSize contentSize = [super intrinsicContentSize];
    return CGSizeMake(contentSize.width + 50, contentSize.height);
}

斯威夫特 5.0

open override var intrinsicContentSize: CGSize {
    let size = super.intrinsicContentSize
    return CGSize(width: size.width + 16, height: size.height)
}

这可能仅在您只有一行要显示的文本时才有效。

于 2014-01-02T02:10:38.860 回答
7

您可以创建一个 UILabel 子类并覆盖内在内容,

-(CGSize)intrinsicContentSize {
    CGSize s = [super intrinsicContentSize];
    s = CGSizeMake(s.width + 20, s.height);
    return s;
}

这将为宽度添加 20 个点的填充。如果您希望文本居中,请务必将文本对齐方式设置为居中。

于 2014-01-02T01:39:33.130 回答
3

如果您使用自动布局,您可以设置水平约束并NSDictionarymetrics参数中使用 an 来动态设置它。

例如,如果您想为 a 的内部内容提供 10pt 的填充UIButton,您可以执行以下操作:

NSDictionary *padding = @{ @"padding" : @(button.intrinsicContentSize.width + 20) };
NSArray *buttonHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button(==padding)]|" options:0 metrics:padding views:NSDictionaryOfVariableBindings(button)];
于 2015-04-15T17:57:31.593 回答
1

如果您尝试为 UILabel 为其父视图提供不同的颜色,则需要将 UILabel 包含在 UIView 中,并带有所需的填充和背景颜色。如果您的 UILabels 背景颜色与其父视图相同,那么我不明白问题只是使用自动布局来指定相对于它旁边的东西您想要多少空间。

于 2014-01-02T01:33:51.940 回答