UILabel sizeToFit不适用于自动布局ios6

我该如何以编程方式(以及在哪种方法中)配置高度取决于文本的UILabel? 我一直试图使用Storyboard和代码的组合来设置它,但无济于事。 大家在设置lineBreakModenumberOfLines推荐sizeToFit 。 但是,无论我将该代码放在viewDidLoad:viewDidAppear:viewDidLayoutSubviews我都无法使其工作。 要么我把这个盒子放得太小,不能长长的文字,要么我把它做得太大,也不会缩小。


请注意 ,在大多数情况下,Matt的解决方案按预期工作。 但如果它不适合你,请进一步阅读。

要使标签自动调整高度,您需要执行以下操作:

  • 为标签设置布局约束
  • 设置低优先级的高度限制。 它应该低于ContentCompressionResistancePriority
  • 设置numberOfLines = 0
  • 将ContentHuggingPriority设置为高于标签的高度优先级
  • 为标签设置preferredMaxLayoutWidth。 该值由标签用来计算其高度
  • 例如:

    self.descriptionLabel = [[UILabel alloc] init];
    self.descriptionLabel.numberOfLines = 0;
    self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.descriptionLabel.preferredMaxLayoutWidth = 200;
    
    [self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
    [self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
    [self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self addSubview:self.descriptionLabel];
    
    NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)];
    [self addConstraints:constrs];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
    [self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
    

    使用Interface Builder

  • 设置四个约束。 高度限制是强制性的。 在这里输入图像描述

  • 然后转到标签的属性检查器并将行数设置为0。 在这里输入图像描述

  • 转到标签的大小检查器,并增加垂直ContentHuggingPriority和垂直ContentCompressionResistancePriority。
    在这里输入图像描述

  • 选择并编辑高度限制。
    在这里输入图像描述

  • 并降低身高限制优先。
    在这里输入图像描述

  • 请享用。 :)


    在iOS 6中,如果使用自动布局,如果UILabel的侧面(或宽度)和顶部被固定,它将自动增长和缩小以适应其内容,完全没有代码,也不会影响其抗压性等等。 它很简单。

    在更复杂的情况下,只需设置标签的preferredMaxLayoutWidth

    无论哪种方式,正确的事情都会自动发生。


    虽然这个问题以编程方式陈述,遇到同样的问题,并且更喜欢在Interface Builder中工作,但我认为使用Interface Builder解决方案添加现有答案可能很有用。

    首先是忘记sizeToFit 。 自动布局将根据您的内容大小代表您处理此问题。

    因此,问题是,如何通过自动布局获得标签以适应其内容? 具体来说 - 因为这个问题提到它 - 高度。 请注意,相同的原则适用于宽度。

    所以,让我们从高度设置为41px的示例UILabel开始:

    在这里输入图像描述

    正如你在上面的屏幕截图中看到的, "This is my text"在上面和下面都有填充。 这是UILabel的高度,它的内容,文本之间的填充。

    如果我们在模拟器中运行应用程序,那么我们看到同样的事情:

    在这里输入图像描述

    现在,让我们在界面生成器中选择UILabel,并查看“大小”检查器中的默认设置:

    在这里输入图像描述

    注意上面突出显示的约束。 这是内容拥抱优先 。 正如Erica Sadun在优秀的iOS Auto Layout Demystified中描述的那样,这是:

    视图倾向于避免对其核心内容进行额外填充

    对于我们来说,使用UILabel,核心内容就是文字。

    在这里,我们来谈谈这个基本情景的核心。 我们给了我们的文本标签两个约束。 他们冲突。 有人说“高度必须等于41个像素高”。 另一个说“拥抱视图的内容,所以我们没有任何额外的填充”。 在我们的例子中,拥抱它的文本视图,所以我们没有任何额外的填充。

    现在,使用Auto Layout,有两个不同的指令说明做不同的事情,运行时必须选择一个或另一个。 它不能做到这一点。 UILabel不能同时高41个像素,并且没有填充。

    解决这个问题的方法是指定优先级。 一条指令必须比另一条指令具有更高的优先级。 如果两个指令说不同的事情,并具有相同的优先级,则会发生异常。

    所以让我们一起去吧。 我的身高限制优先级为1000 ,这是必需的 。 内容拥抱高度是250 ,这是微弱的 。 如果我们将身高限制优先级降至249,会发生什么情况?

    在这里输入图像描述

    现在我们可以看到神奇的开始发生。 让我们试试sim:

    在这里输入图像描述

    真棒! 内容拥抱取得成功。 仅仅因为身高优先级249小于拥抱优先级250的内容。 基本上,我说“我在这里指定的高度并不比我为内容拥抱指定的高度重要”。 所以,内容拥抱赢了。

    底线,让标签适合文本可以像指定高度或宽度约束一样简单,并正确设置与该轴的内容拥抱优先级约束关联的优先级。

    作为读者的练习,会留下宽度的等效物!

    链接地址: http://www.djcxy.com/p/28181.html

    上一篇: UILabel sizeToFit doesn't work with autolayout ios6

    下一篇: UILabel and numberOfLines and sizeToFit: