3

如果我将包含以下两个视图层次结构和约束中的任何一个的场景放在一起(在 InterfaceBuilder 中很容易完成),那么一切都会按预期工作......


1)

  • 全屏UIScrollView(到超级视图所有边缘的距离为 0)
  • 在 中UIScrollView,单个UILabelnumberOfLines设置为0,具有 100% 宽度(0 距离前导和尾随约束),没有高度约束,具有大量文本(1000 行),并且具有常量为 0 的顶部和底部约束(因此从 的边界UILabel到 的内容视图应该有 0 距离UIScrollView)。

行为如预期:调整UILabel大小以适合其内容,这会强制 的内容视图UIScrollView扩展以适合文本,使所有文本可滚动。


2)

  • 一个等于UILabel在一些外部视图中的一些内部视图中,这样: numberOfLines0UIView UIView
    • 标签的边缘与innerView边缘的距离均为 0 (优先级为 1000)
    • innerView的边缘与outerView的边缘的距离均为 0 (优先级为 1000)
    • outerView的顶部、前缘和后缘与父视图的距离均为 0(优先级为 1000)
    • outerView的高度小于其父视图的全高,由高度约束或底部到父视图的距离约束强制执行,但这个最终约束具有较低的优先级 - 例如 600。

在这种情况下,行为再次符合预期:如果UILabel的 Content Compression Resistance Priority 大于 600,则 outerView的高度增加以适合所有文本,如果小于,则标签被截断。


然而,尽管在我看来与其他两种情况完全相似,但以下情况并不像我预期的那样工作:

3)

  • 全屏UIScrollView,和第一种情况一样
  • 在 内UIScrollView,一个UIView 内部视图,其边缘与 ' 的边缘的距离均为 0 UIScrollView(如第二种情况)。
  • innerView中,aUILabel设置numberOfLines0,文本负载,内容压缩阻力优先级设置为 1000。

基于前两个测试用例,我的期望是UIScrollView的内容视图应该调整大小以适应标签的文本。然而,相反,内容视图被设置为 的大小,UIScrollViewinnerView 也是如此,并且UIScrollView是不可滚动的。

UILabel为什么我得到的这种行为与我之前的两个测试用例不一致,当我将它嵌套在自动布局下的视图中时,如何获得工作内容压缩阻力并具有我尊重的内在内容大小UIScrollView?我看不出自动布局UILabel在第三种情况下压缩我的任何理由,因为它完全有可能压缩它并且仍然以与第一种情况完全相同的方式满足所有约束。

4

1 回答 1

2

我遇到过同样的问题。苹果似乎有一个错误,因此多行文本需要两次通过的方法来正确布局,并且这一切都依赖于属性 preferredMaxLayoutWidth。

我最终将这两个方法添加到 ScrollViewController:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self performSelectorOnMainThread:@selector(adjustScrollContentSizeOnMainThread) withObject:nil    waitUntilDone:NO];
}

- (void)adjustScrollContentSizeOnMainThread
{
    self.myLabel.preferredMaxLayoutWidth = self.myLabel.bounds.size.width;
}

我的解决方案基于这个答案: https ://stackoverflow.com/a/13616052/2828256

于 2014-01-14T12:36:23.717 回答