swift:以编程方式创建UILabel固定宽度,根据文本长度垂直调整大小

时间:2016-11-12 21:23:47

标签: ios swift uilabel autoresize

我已经看到了涉及自动布局的垂直大小调整的答案,但{I}创建的UILabel仅在运行时需要。 (我可能需要从0到很多这些标签的任何地方。)

示例(忽略颜色)

  1. 短文本(注意与较长文本相同的宽度):
  2. enter image description here

    1. 较长的文字(请注意与较短的文字示例相同的宽度,并添加更多行以添加' l文字):
    2. enter image description here

      如果文本可以适合固定宽度的一行,则标签不需要垂直调整大小。但是如果有更多字符,标签应该保持垂直扩展以适应这些附加字符。文本应该一行一行地包裹。文本应从标签的左上角开始。

      更具体一点:

      let marker = GMSMarker(position: myLatLng)
      // see http://stackoverflow.com/a/40211383/1168364 for imageWithView
      marker.icon = imageWithView(label) // **how do i create this label?**
      marker.map = map // map is a GMSMapView
      

      这些标签可以在屏幕上的任何位置。这适用于地图应用程序,其中每个标签将放置在随机位置。标签'地点之间没有任何关系。

2 个答案:

答案 0 :(得分:11)

UIView有两种有用的方法: sizeToFit() sizeThatFits(_:)

第一个将视图调整为最小尺寸以适合子视图'内容和第二个内容根本不会改变帧,但会返回计算出的大小:(1)适合所有子视图,(2)不超过参数size

因此,您可以使用 sizeThatFits

let label = UILabel()

override func viewDidLoad() {
    super.viewDidLoad()

    label.backgroundColor = UIColor.orange
    label.textColor = UIColor.white
//  label.text = "ultimate Frisbee"
    label.text = "ultimate Frisbee\nin 3 minutes,\nall welcome|2"
    label.numberOfLines = 10
    view.addSubview(label)

    updateLabelFrame()
}

func updateLabelFrame() {
    let maxSize = CGSize(width: 150, height: 300)
    let size = label.sizeThatFits(maxSize)
    label.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: size)
}

<强>输出:

enter image description here enter image description here

P.S。您也可以使用autolayout约束来解决您的问题,但我不是以编程方式使用它们的忠实粉丝。

答案 1 :(得分:1)

将标签的numberOfLines属性设置为零,并使用约束来固定标签的宽度(通过明确约束宽度或将前沿和后边缘约束到其他视图,如标签&# 39;超级视图)。然后标签将自动垂直调整到适合文本的高度。您需要通过其顶部约束来固定一个标签,以便视图系统知道从哪里开始布局,然后所有其他标签的顶部应该被约束到前一个标签的底部。这样,它们将相对于前一个标签的高度进行布局。

根据您的评论进行修改:

您可以使用widthAnchor属性在iOS 9及更高版本上显式设置视图的宽度。您可以使用NSLayoutConstraints在旧版iOS上进行设置(例如,搜索SO)。

e.g:

label.widthAnchor.constraintEqualToConstant(50.0).active = true

这会将标签的宽度设置为50点宽,但不会修正其高度,因此使用numberOfLines = 0时,标签会在您设置文本时垂直自动调整大小。