【问题标题】:Fluid vertical layout, dynamic labels and autolayout流畅的垂直布局、动态标签和自动布局
【发布时间】:2014-07-03 15:43:46
【问题描述】:

我正在尝试在 ios7 中使用自动布局复制流畅的垂直布局。 问题是我正在使用一堆UILabels(和其他元素)和AttributedStrings(但这似乎不会干扰问题,因为它也带有纯文本)并且标签中的文本是动态添加的,但框架或更好的约束似乎不会以正确的方式自动适应(未指定标签的高度),因为标签仍然是 xib 中给出的尺寸。

Xib中的初始配置,蓝色为设置等式约束

如果我使用设置一个较大的高度约束常数,其值低于压缩和拥抱优先级,则相同。没有任何变化。

添加文本和调整约束值后(文本应该有 5行

我终于尝试在每次文本以这种方式或使用 CoreText 或许多其他方法更改时重新创建约束

[self.view setAutoresizesSubviews:NO];
label.lineBreakMode = NSLineBreakByWordWrapping;
label.numberOfLines = 0;
label.preferredMaxLayoutWidth = label.frame.size.width;

[label removeConstraint:oldConstraint];

NSInteger height = ceil([label.attributedText
               boundingRectWithSize:CGSizeMake(label.frame.size.width, 10000)
               options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
               //TODO 20 or 1.5 is an hardoced value. find solution to workaround
               //attributes:@{NSFontAttributeName:[UIFont fontWithName:kFontCrimsonText_Roman size:17]}
               context:nil].size.height) + 1;

NSLayoutConstraint * newConstraint = [NSLayoutConstraint constraintWithItem:label
                                                                  attribute:NSLayoutAttributeHeight
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:nil
                                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                                 multiplier:1.0f
                                                                   constant:height];
[label addConstraint:newConstraint];

这一次标签的尺寸看起来是正确的,但里面的文字显示不正确:

假设我有一个 5 行的文本,仅显示第一行,最后一个被剪掉,尽管框架似乎完全符合所需的尺寸。

将高度乘以 2(或其他常数)似乎可以解决问题,但显然现在文本比框架更小,顶部和底部仍有大量空白。。 p>

尝试使用[label fitToSize] 似乎效果很好,但显然约束会在之后立即恢复框架。

使用动态 UIlabels 和自动布局实现垂直流畅布局的最佳做法是什么?

【问题讨论】:

  • 忘了说我不能使用 A TableView

标签: ios text autolayout


【解决方案1】:

创建“流动垂直布局”的最佳方式...UITableView

说真的,这看起来很适合使用 UITableView

它不仅仅用于显示数据列表。例如,在 iOS 的 Contacts 应用程序中,单个联系人(您可以在其中添加号码和电子邮件等)使用 UITableView 来布局界面。

无需计算标签的高度和位置等所有麻烦......

使用您的UILabels 之一的正确布局定义自定义UITableViewCell,然后您只需将正确的文本放入正确的行。

UITableView 是一个非常强大的工具。

【讨论】:

  • 啊该死的我忘了写.. xib 很大,我没有设计它,我被告知我不能使用桌子(这是我想到的第一件事)。但如果没有解决方案,我可能最终会乞求这个。无论如何,我仍然会知道代码有什么问题。谢谢。
  • 嗯...这是一个棘手的情况。如果“更高的权力”告诉你尝试以某种方式去做,那么我会接近他们并解释试图得到它以“错误的方式”工作将花费更长的时间和更多的错误(即成本更高),而不是您能够以 UITableView 的方式进行操作。这是作为开发人员的另一面。必须让人们以你看待事物的方式看待事物。 :) 祝你好运。
  • 好吧,我有一个赏金,因为我接受了我自己的答案,没有人做得更好,我会把它分配给你:)
【解决方案2】:

我最终发现这是一个错误,因为在 ios7 中打开了自动布局的 UILabel 中使用了 AttributedText。

另一个问题中建议的临时解决方法是将换行符附加到属性字符串并减少“底部边距”。

另一个是你使用textview。

还报告了以下错误:
- Lines missing from tall UILabel when embedding NSTextAttachment
- iOS 7 BUG - NSAttributedString does not appear

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多