IOS / Objective-C:MakeUILabel使用Autolayout流向多行

时间:2018-03-22 17:02:06

标签: ios autolayout uilabel

我试图让UILabel流向多行并使用autolayout将其下方的元素向下推。

这是我在viewwillappear中调用的代码。

self.myLabel.numberOfLines = 0;
self.myLabel.lineBreakMode = NSLineBreakByWordWrapping;
[_myLabel setContentCompressionResistancePriority:1000
               forAxis:UILayoutConstraintAxisVertical];
[self.myLabel setNeedsDisplay];
[self.myLabel layoutIfNeeded];
[self.view setNeedsDisplay];
[self.view layoutIfNeeded];

UILabel被限制在内容视图的顶部,其下方的图像被约束到UILabel的底部。标签还具有> = 21的高度约束。

在初始加载时,标签只显示一行。

奇怪的是,在启动模态VC并关闭它之后,标签会转到多行,但无法按下它下面的元素。

初次加载时。

enter image description here

启动和取消模态VC后

enter image description here

我想知道这个问题是否与布局子视图的时间有关,但几乎尝试了所有事情。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:1)

简单示例:

  • 创建一个新的ViewController。
  • 添加一个按钮,从顶部约束40个点并水平居中
  • 添加UIView(绿色视图)。约束水平居中,宽度为240,顶部空间为20的按钮。
  • 在绿色视图中添加两个标签。
  • 顶部标签,行数= 0,前导和尾随约束为16,顶部约束为8(对于绿色超级视图)
  • 底部标签,水平居中,顶部空间至顶部标签8,底部约束为8(至绿色超视图)。
  • 将顶部标签连接到视图控制器中的@IBOutlet var multiLineLabel: UILabel!
  • 将按钮touch-up-inside连接到视图控制器中的@IBAction func didTap(_ sender: Any)功能。
  • 不改变优先级。

运行该应用。每次按下该按钮都会在顶部/多行标签上添加文字,并将“按下”底部标签,然后“按下”绿色视图的底部边缘。

enter image description here

class ExpandingLabelViewController: UIViewController {

    @IBOutlet var multiLineLabel: UILabel!

    @IBAction func didTap(_ sender: Any) {

        if let s = multiLineLabel.text {

            multiLineLabel.text = s + " Here is some more text."

        }

    }

}

完成后,您可以向视图中添加其他元素。只需确保你有一个垂直间距约束的“链”,最顶层的元素被约束到绿色超视图的顶部,最底部的元素被约束到绿色超视图的底部。