Swift - 如何基于UILabel大小(内部)调整UIView的大小

时间:2018-04-20 05:33:08

标签: swift layout uiview uilabel

我在Swift中有点新鲜,我需要一些帮助:

我在UIView中有一个UILabel,这个标签可以接收任何文本。因此,我希望根据收到的文本调整UILabel的大小,并调整其容器UIView的大小。 UILabel必须具有最大宽度但不能具有最大高度。它与带有消息文本的Whatsapp中发生的情况非常类似(他的绿色容器与内部文本一致)。

我相信它是关于自动布局的,但我真的无法理解它的大部分内容。

编辑:动态创建。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

包含标签的UIView不应该具有固定的高度。 只需添加约束来设置UIView宽度和X / Y坐标。

在其内部,UILabel应该对UIView的上/下和右/左固定约束,并将其numberOfLines设置为0

使用这些约束,容器视图将展开以根据文本调整高度。

参见随附的截图

添加容器视图约束(注意没有添加底部或高度约束) Adding Container View Constraints (notice no bottom or height constraint added)

添加标签约束(固定约束到所有UIView边缘)

Label Constraints (fixed constraints to all UIView Edges)

短文字结果

Result with short text

长文字结果

Result with long text

答案 1 :(得分:0)

@Lefteris的答案是正确的。无需定义包含视图的宽度和高度。您只需要在其父边缘约束它,然后将其内部的标签约束在包含视图的边缘。

这是我在代码中的操作方式。

let containingView: UIView = UIView()
containingView.translateAutoresizingMaskIntoConstraints = false
addSubview(containingView)

let labelInside: UILabel = UILabel()
labelInside.translateAutoresizingMaskIntoConstraints = false
containingView.addSubview(labelInside)

NSLayoutConstraint.activate([
  //in my case, i want my containingView on the top left corner of the superView.
   containingView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
   containingView.topAnchor.constraint(equalTo: contentView.topAnchor),

   labelInside.leadingAnchor.constraint(equalTo: containingView.leadingAnchor),
   labelInside.trailingAnchor.constraint(equalTo: containingView.trailingAnchor),
   labelInside.topAnchor.constraint(equalTo: containingView.topAnchor),
   labelInside.bottomAnchor.constraint(equalTo: containingView.bottomAnchor)
])

现在,如果您想在标签中包含一些边距/插图,则只需在定义约束时添加一个常数即可。 :) HTH

答案 2 :(得分:-1)

下面的属性对我有用,希望这会有所帮助

 [label sizeToFit];