Chèn Image (icon) vào UILabel

Làm thế nào để chèn image vào UILabel. Bạn không thể chèn 1 image vào String ,nhưng lại có thể chèn image vào NSAttributedString.Nên để tạo 1 UILabel với nội dung image thì việc đầu tiên là tạo 1 NSAttributedString được chèn image rồi set attributedText.

NSTextAttachment

Tạo image rồi set vào NSTextAttachment vào sau đó tạo NSAttributedString với NSTextAttachment object vừa đc set image.

        // attachment
        let textAttachment: NSTextAttachment = NSTextAttachment()
        textAttachment.image = UIImage(named: "icon.png")
        let attributedImage =  NSAttributedString(attachment: textAttachment)

Set NSAttributedString vào UILabel

     let label =  UILable()
     label.attributedText = attributedImage

Tuy nhiên, Image sau khi đc set vào Label sẽ bị lêch lên trên so với text của label, nên để chỉnh image ở center so với label thì mình căn chỉnh như sau.

Căn chỉnh Image in Center

Mỗi UILabel sẽ đi kèm với UIFont, mỗi font sẽ có những giá ascender, descender khác nhau.Và do đó image khi chèn sẽ bị lêch lên trên với những giá trị khác nhau.

        // attachment
        let textAttachment: NSTextAttachment = NSTextAttachment()
        textAttachment.image = UIImage(named: "icon.png")
        
        // center font
        if let image = textAttachment.image,
            let _font = font {
            let y = ((_font.ascender - _font.descender)/2 - image.size.height/2)
            textAttachment.bounds = CGRect(x: 0, y: y, width: image.size.width, height: image.size.height).integral
        }
        let attributedImage =  NSAttributedString(attachment: textAttachment)