3

I would like to mask text of a UILabel to achieve the following result

enter image description here

Amal T S
  • 3,327
  • 2
  • 24
  • 57
Luda
  • 7,282
  • 12
  • 79
  • 139
  • 2
    I think this is what you mean: [https://stackoverflow.com/questions/28082055/how-could-you-make-a-uilabel-wrap-around-an-image-like-shown](https://stackoverflow.com/questions/28082055/how-could-you-make-a-uilabel-wrap-around-an-image-like-shown) – Johan Velthuis Jun 10 '19 at 08:40

3 Answers3

0

In Swift, You can do it like this:

var attributedString = NSMutableAttributedString(string: "Your String")

let textAttachment = NSTextAttachment()
textAttachment.image = UIImage(named: "Your Image Name")

let attrStringWithImage = NSAttributedString(attachment: textAttachment)
attributedString.insert(attrStringWithImage, at: 0)

label.attributedText = attributedString
Anshul Bhatheja
  • 673
  • 3
  • 21
0

This will work for you .

extension UILabel
{
    func addImage(imageName: String)
    {
        let attachment:NSTextAttachment = NSTextAttachment()
        attachment.image = UIImage(named: imageName)

        let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment)
        let myString:NSMutableAttributedString = NSMutableAttributedString(string: self.text!)
        myString.appendAttributedString(attachmentString)

        self.attributedText = myString
    }
}

Another version of the code that allow adding the icon before or after the label.

extension UILabel
{
    func addImage(imageName: String, afterLabel bolAfterLabel: Bool = false)
    {
        let attachment: NSTextAttachment = NSTextAttachment()
        attachment.image = UIImage(named: imageName)
        let attachmentString: NSAttributedString = NSAttributedString(attachment: attachment)

        if (bolAfterLabel)
        {
            let strLabelText: NSMutableAttributedString = NSMutableAttributedString(string: self.text!)
            strLabelText.appendAttributedString(attachmentString)

            self.attributedText = strLabelText
        }
        else
        {
            let strLabelText: NSAttributedString = NSAttributedString(string: self.text!)
            let mutableAttachmentString: NSMutableAttributedString = NSMutableAttributedString(attributedString: attachmentString)
            mutableAttachmentString.appendAttributedString(strLabelText)

            self.attributedText = mutableAttachmentString
        }
    }

   //you can remove the image by calling this function
    func removeImage()
    {
        let text = self.text
        self.attributedText = nil
        self.text = text
    }
}
Mantu
  • 1,017
  • 1
  • 10
  • 21
0

enter image description here

For this use a UITextView instead of UILabel.

let imgRectBezier = UIBezierPath(rect: imgView.frame)
txtView.textContainer.exclusionPaths = [imgRectBezier]

Using this, the text will be excluded from the frame area added in the exclusion paths. You can even exclude multiple frames.

Amal T S
  • 3,327
  • 2
  • 24
  • 57