【问题标题】:How to create dynamic label size programmatically in swift?如何以编程方式快速创建动态标签大小?
【发布时间】:2017-09-28 21:00:35
【问题描述】:

我正在尝试在 Swift 中以编程方式创建标签,但我遇到的问题是,基于数据模型,文本的数量可以改变,从而改变标签的大小。通常我会在知道文本之前创建这样的标签:

headerLabel.frame = CGRect(x: 0, y: 0, width: screenSize.width/2.5, height: screenSize.height/45)
headerLabel.center = CGPoint(x: screenSize.width/2, y: 245)

但在这种情况下,文本可以是从一行到一个段落的任意数量,因此对高度进行硬编码是行不通的。如何创建标签以容纳任意数量的文本?

【问题讨论】:

  • 设置行数为0
  • 它是通过程序完成的,如何设置框架?

标签: ios swift dynamic uilabel frame


【解决方案1】:

您可以在将文本提供给标签后访问标签内在属性,然后您可以提供框架。

斯威夫特 3:

let label = UILabel()
label.text = "Your text here"
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 14)
label.frame = CGRect(x:0,y:0,width:label.intrinsicContentSize.width,height:label.intrinsicContentSize.height)

你可以根据intrinsicContentSize检查一些条件。

希望对你有帮助。

【讨论】:

  • 您使用 label.intrinsicContentSize.width 作为宽度和高度。
  • 谢谢!!它有帮助.. +10 :)
【解决方案2】:

此标签具有定义的宽度,但没有定义的高度。高度由标签中的文本量决定。如果您删除了宽度,标签将不会分成几行,这不是您想要的。最后调用的sizeToFit() 方法在根据标签的文本知道需要拆分多少行文本后设置标签的高度。如果这不是您想要的,请告诉我。

let label = UILabel()
label.text = "scones"
label.numberOfLines = 0 // 0 = as many lines as the label needs
label.frame.origin.x = 32
label.frame.origin.y = 32
label.frame.size.width = view.bounds.width - 64
label.font = UIFont.displayHeavy(size: 17) // my UIFont extension
label.textColor = UIColor.black
label.sizeToFit()
view.addSubview(label)

【讨论】:

    【解决方案3】:

    您可以使用以下方法计算字符串的高度和宽度,然后进行设置:

    import Foundation
    import UIKit
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            let width = "Hello World".stringWidth // 74.6
            let height = "Hello World".stringHeight // 16.7
    
            let headerLabel = UILabel()
            headerLabel.frame = CGRect(x: 0, y: 0, width: width, height: height)
            headerLabel.center = CGPoint(x: screenSize.width/2, y: 245)
        }
    }
    
    extension String {
        var stringWidth: CGFloat {
            let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude)
            let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil)
            return boundingBox.width
        }
    
        var stringHeight: CGFloat {
            let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude)
            let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil)
            return boundingBox.height
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多