gpt4 book ai didi

ios - 如何以编程方式使用自动布局排列这三个 UILabel?

转载 作者:行者123 更新时间:2023-12-01 19:05:56 25 4
gpt4 key购买 nike

我有一个 UIView有三个 UILabels在上面。我有一个 title , subtitle , 和 subtitleDescription , 所有 UILabel特性。我希望我的标题在左上角,标题下方的字幕没有间隙,并且 subtitleDescription 到字幕的右侧没有间隙,将基线与字幕基线对齐。如果是 View ,我想要省略号,或者在 subtitle/subtitleDescription 的情况下需要 View 。我想以编程方式使用自动布局。

与此类似:

  _________________________________
|[title] |
|[subtitle][subtitleDescription] |
|________________________________|

我希望标签转到左上角而不是居中。在我现在的代码中,它都是居中的,所有的标签都在彼此之上。

我只是调用 sizeToFit在所有 UILabel的,除此之外我根本不调整框架。当然,这段代码是在我分配和初始化标签并设置文本之后。这是我的代码:
 - (void)setup
{
[self.title sizeToFit];
[self.subtitle sizeToFit];
[self.subtitleDescription sizeToFit];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[title]-(>=0)-|"
options:kNilOptions
metrics:nil
views:@{ @"title" : self.title }]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[subtitle]-5-[subdesc]-(>=0)-|"
options:NSLayoutFormatDirectionLeftToRight
metrics:nil
views:@{ @"subtitle" : self.subtitle,
@"subdesc" : self.subtitleDescription }]];

// compR > compR
[self setContentCompressionResistancePriority:900 forAxis:UILayoutConstraintAxisHorizontal];
[self setContentCompressionResistancePriority:500 forAxis:UILayoutConstraintAxisHorizontal];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[title]-5-[subtitle]|"
options:kNilOptions
metrics:nil
views:@{ @"title" : self.title,
@"subtitle" : self.subtitle }]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.subtitleDescription
attribute:NSLayoutAttributeBaseline
relatedBy:NSLayoutRelationEqual
toItem:self.subtitle
attribute:NSLayoutAttributeBaseline
multiplier:1.0
constant:0]];
}

谢谢!!!

这是 View 的屏幕截图:

enter image description here

更新

正如 jrturton 向我指出的那样,看起来我的所有约束都被约束异常所打破。我想弄清楚为什么它们坏了。给出的消息是“无法同时满足约束”。

最佳答案

首先,通过设置 translatesAutoResizingMaskIntoConstraints = NO 确保您的标签启用了自动布局。 .

您不需要任何 sizeToFit来电。在添加约束时,它们是没有意义的。标签将在布局点使用其固有大小。

为防止居中,只需不要固定到 super View 的两侧。所以代替这个:

"|[title]-(>=0)-|"

做这个:
"|[title]"

或者确实是这样:
"|[title]|"

并在标签上设置左对齐。

对于一行中的多个标签,您需要这样:
"|[subtitle]-5-[subdesc]|"

路过 NSLayoutFormatAlignAllBaseline在选项中。如果需要,您可以将这些选项或 ( |) 一起使用。同样,您不需要不等式间距。左对齐标签将占用尽可能多的空间。您可能希望在两个标签上设置压缩阻力/拥抱优先级,这样如果没有足够的空间来显示这两个值,您就有规则截断哪个标签。

您正在 View 本身上设置内容压缩阻力,如果 View 本身也不受自动布局的影响,这将毫无意义。您还将两次设置为两个不同的值,我不确定您希望通过它实现什么。

如果 super View 具有固定大小,您当前的垂直约束将导致一个或其他标签被拉伸(stretch)以填充剩余大小,这将使文本垂直居中,这就是标签太高时所做的事情。

您可以通过不固定到底部来克服这个问题:
"V:[title]-5-[subtitle]"

我写了大量关于 VFL 和自动布局的文章 here ,以及其他与自动布局相关的文章的链接。

关于ios - 如何以编程方式使用自动布局排列这三个 UILabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com