【问题标题】:swift: programmatically create UILabel fixed width that resizes vertically according to text lengthswift:以编程方式创建 UILabel 固定宽度,根据文本长度垂直调整大小
【发布时间】:2017-03-26 20:30:08
【问题描述】:

我已经看到了涉及自动布局的垂直调整大小的答案,但我正在创建的 UILabels 仅在运行时需要。 (我可能需要从零到许多这样的标签。)

示例(忽略颜色)

  1. 短文本(注意与长文本宽度相同):

  1. 较长的文本(注意与较短文本示例的宽度相同,添加文本的行数更多):

如果文本可以容纳在固定宽度的一行中,则标签不需要垂直调整大小。但是如果有更多字符,标签应该保持垂直扩展以适应这些额外的字符。文本应逐行环绕。文本应从标签的左上角开始。

更具体:

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

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

【问题讨论】:

  • @alexburtnik 你能重新考虑一下这不是重复的吗?该解决方案似乎在这里不起作用。注意固定宽度的添加要求。也许您对以下解决方案不起作用的原因有所了解。
  • 我撤回了近距离投票,但它仍然是重复的。下面的解决方案假设您正在使用自动布局约束。我下面的解决方案是另一种选择,它是手动更新框架。

标签: ios swift uilabel autoresize


【解决方案1】:

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)
}

输出:

附:您也可以使用自动布局约束来解决您的问题,但我不喜欢以编程方式使用它们。

【讨论】:

    【解决方案2】:

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

    根据您的评论进行编辑:

    您可以在 iOS 9 及更高版本上使用widthAnchor 属性显式设置视图的宽度。您可以使用 NSLayoutConstraints 在较旧的 iOS 版本上设置它(搜索 SO 以获取示例)。

    例如:

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

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

    【讨论】:

    • 我的标签的位置彼此没有关系
    • @lf215 那么您只需将numberOfLines 属性设置为零即可获得动态高度(假设宽度是固定/受约束的,否则它只会布置为一条长线)跨度>
    • 我已经用代码更新了我的问题。正如您所说,我不清楚如何仅“通过明确限制宽度”来固定宽度。你的意思是像this这样的东西吗?
    • @lf215 是的,或者使用widthAnchor,请参阅我的答案的编辑。
    • 你可能想设置label.translatesAutoresizingMaskIntoConstraints = false
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多