How to get the height of a UILabel in Swift?

前端 未结 5 925
误落风尘
误落风尘 2020-12-17 15:21

I am a beginner in Swift and I am trying to get the height of a label. The label has multiple lines of text. I want to know the total height it occupies on the screen.

相关标签:
5条回答
  • 2020-12-17 15:49

    @iajmeri43's answer Updated for Swift 4

    func estimatedLabelHeight(text: String, width: CGFloat, font: UIFont) -> CGFloat {
    
        let size = CGSize(width: width, height: 1000)
    
        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    
        let attributes = [NSAttributedStringKey.font: font]
    
        let rectangleHeight = String(text).boundingRect(with: size, options: options, attributes: attributes, context: nil).height
    
        return rectangleHeight
    }
    

    To use it (step 4):

    // 1. get the text from the label
    guard let theLabelsText = myLabel.text else { return }
    
    // 2. get the width of the view the label is in for example a cell
    // Here I'm just stating that the cell is the same exact width of whatever the collection's width is which is usually based on the width of the view that collectionView is in
    let widthOfCell = self.collectionView.frame.width
    
    // 3. get the font that your using for the label. For this example the label's font is UIFont.systemFont(ofSize: 17)
    let theLabelsFont = UIFont.systemFont(ofSize: 17)
    
    // 4. Plug the 3 values from above into the function
    let totalLabelHeight = estimatedLabelHeight(text: theLabelsText, width: widthOfCell, font: theLabelsFont)
    
    // 5. Print out the label's height with decimal values eg. 95.46875
    print(totalLabelHeight)
    
    // 6. as @slashburn suggested in the comments, use the ceil() function to round out the totalLabelHeight
    let ceilHeight = ceil(totalLabelHeight)
    
    // 7. Print out the ceilHeight rounded off eg. 95.0
    print(ceilHeight)
    
    0 讨论(0)
  • 2020-12-17 15:59

    Swift 5 ioS 13.2 tested 100%, best solution when the UILabel numberOfLines = 0

    Note, result is rounded. Just remove ceil() if you don't want it.

    If you want to get height -> give storyboard width of UILabel

    If you want to get width -> give storyboard height of UILabel

        let stringValue = ""//your label text
        let width:CGFloat = 0//storybord width of UILabel
        let height:CGFloat = 0//storyboard height of UILabel
        let font = UIFont(name: "HelveticaNeue-Bold", size: 18)//font type and size
    
        func getLableHeightRuntime() -> CGFloat {
            let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
            let boundingBox = stringValue.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
            return ceil(boundingBox.height)
        }
    
        func getLabelWidthRuntime() -> CGFloat {
            let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
            let boundingBox = stringValue.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
            return ceil(boundingBox.width)
        }
    
    0 讨论(0)
  • 2020-12-17 16:07

    Updated for Swift 3

    func estimatedHeightOfLabel(text: String) -> CGFloat {
    
        let size = CGSize(width: view.frame.width - 16, height: 1000)
    
        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    
        let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 10)]
    
        let rectangleHeight = String(text).boundingRect(with: size, options: options, attributes: attributes, context: nil).height
    
        return rectangleHeight
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        guard let labelText = label1.text else { return }
        let height = estimatedHeightOfLabel(text: labelText)
        print(height)
    }
    

    0 讨论(0)
  • 2020-12-17 16:08

    Swift 4 with extension

    extension UILabel{
    
    public var requiredHeight: CGFloat {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: frame.width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text
        label.attributedText = attributedText
        label.sizeToFit()
        return label.frame.height
      }
    }
    
    0 讨论(0)
  • 2020-12-17 16:11

    it's simple, just call

    label.bounds.size.height
    
    0 讨论(0)
提交回复
热议问题