【问题标题】:UILabel won't word wrap inside UIScrollView with AutoLayoutUILabel 不会在带有 AutoLayout 的 UIScrollView 内自动换行
【发布时间】:2014-10-28 13:34:59
【问题描述】:

我在 UIScrollView 中有一个 UILabel,我正在尝试自动换行。我想使用 AutoLayout 进行布局配置。当UILabel 不在UIScrollView 中时,它会完美换行。我只需要将行数设置为 0 并将换行模式设置为自动换行。

但是,当我将 UILabel 放入 UIScrollView 中时,自动换行不再起作用。我已经检查了“Dynamic UILabel height inside UIScrollView with AutoLayout”和“Correctly Size UILabel inside UIScrollView using Interface Builder and Autolayout?”,但这些问题都没有对我有帮助的答案。

如果有人想看的话,我有 set up a test project 说明我在说什么。

【问题讨论】:

  • 其实你引用的问题的答案正是你所需要的。问题是你没有听他们告诉你什么。

标签: ios objective-c iphone uiscrollview uilabel


【解决方案1】:

原因是滚动视图中的约束,固定到滚动视图,并不意味着你认为它们的意思。它们与从内向外确定滚动视图的contentSize 有关;他们自己并不能从外向内确定滚动视图内事物的大小。请在此处查看我的答案:https://stackoverflow.com/a/13548039/341994

在您的情况下,最简单的解决方案是使用中间内容视图,以便您拥有此层次结构:

scroll view
    content view
        label

现在为内容视图提供绝对宽度和高度约束,并将其固定在滚动视图的所有四个侧面。 现在标签将按您的预期工作。内容视图有足够的约束来绝对设置它自己的大小并从内部约束滚动视图的contentSize。同时,标签上的约束不是针对滚动视图而是针对内容视图,并且由于内容视图具有固定大小并且是普通视图(不是滚动视图),因此标签上的约束符合您的期望.

【讨论】:

  • 如果您仔细查看您发布的项目,您会发现 Xcode 实际上是在告诉您这一点。滚动视图的布局结构存在警告。该警告实际上是在告诉您我在这里告诉您的同一件事。不要忽略 Xcode 中的自动布局警告!他们意味着什么。
  • 非常感谢您的回答,这有助于我了解正在发生的事情。但是,您说的这个content view 是什么?容器视图?
  • 它是一个普通的 UIView,其目的是做我刚才描述的事情——充当中间视图,以便设置 contentSize 并且内部约束将起作用。
  • 我已经在 github 上的 fork 中修复了您的示例并创建了一个拉取请求。向您展示比用文字描述要容易得多!
  • 非常感谢您花时间帮助我。我现在明白内容视图是控制滚动视图内容大小以进行滚动的内容。我已经成功地重现了你教给我的东西。再次感谢。
【解决方案2】:

我遇到了同样的问题,但是通过在标签上设置以下约束,我能够让 UILabel 正确换行

  • 引领空间走向Superview
  • 到 Superview 的尾随空间
  • 与 Superview 的宽度相等 **(这是限制标签宽度的宽度,以便正确包裹)

您还必须有从滚动视图的顶部到底部的约束。例如,如果您只有标签,则必须将 Top Space 和 Bottom Space 设置为 Superview。如果你不这样做,它将有一个模棱两可的可滚动内容高度。

要防止滚动视图水平滚动,请选中“启用方向锁定”并在 scrollViewDidScroll 方法中正确调用 setContentOffset(有关详细信息,请参阅this 问题的第一个答案)。

【讨论】:

    【解决方案3】:

    尝试使用UILabel's preferredMaxLayoutWidth 并将其设置为父视图的宽度。

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多