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

标签 ios swift uilabel autoresize

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

例子(忽略颜色)

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

enter image description here

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

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

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

最佳答案

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

第一个将 View 调整到最小尺寸以适应 subview 的内容,第二个根本不改变框架,但返回计算出的尺寸:(1)适合所有 subview 并且(2)不超过参数大小

因此您可以使用 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

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

关于ios - swift:以编程方式创建 UILabel 固定宽度,根据文本长度垂直调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40567804/

相关文章:

c# - WinForms 类似 iPad 的界面原型(prototype)设计应用程序

ios - 以编程方式调用 PerformSegueWithIdentifier 不会执行任何操作

swift - 如果空格或空白,如何不将 UITextField 中的项目追加到数组 - Swift

ios - UITextView vs UILabel 高度计算

javascript - 打印媒体查询不适用于 iOS(chrome、safari、mozilla)

ios - 等待 alamofire 完成获取请求并创建对象

ios - 删除日文字符时 Swift "can not increment endIndex"

ios - UILabel LineBreakMethod

ios - 你如何在 iOS 中制作一个可编辑的标签(比如命名一个提醒列表)?

ios - 随机获取 Error Domain=NSURLErrorDomain Code=-1005 “The network connection was lost.”