How to insert an Inline UILabel image in iOS 8 using swift

I followed the following post on how to use NSTextAttachment to add images with your UILabels. I followed everything I could and wrote my version in Swift.

I am creating a chat application and the field into which I paste the beer icon does not display the image or does not seem to make the image embedded. I am not getting any errors, so I assume that my code is missing a small little detail.

var beerName:String! if(sender == bn_beer1) { beerName = "beer1.png" } if(sender == bn_beer2) { beerName = "beer2.png" } if(sender == bn_beer3) { beerName = "beer3" } var attachment:NSTextAttachment = NSTextAttachment() attachment.image = UIImage(named: beerName) var attachmentString:NSAttributedString = NSAttributedString(attachment: attachment) var myString:NSMutableAttributedString = NSMutableAttributedString(string: inputField.text) myString.appendAttributedString(attachmentString) inputField.attributedText = myString; 
+5
source share
3 answers

This does not work on UITextField. It only works on UILabel.

Here is a UILabel extension based on your code (Swift 2.0)

 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 } } 

EDIT:

here is a new version that allows you to add an icon before or after the tag. There is also a function to remove the icon from 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 } } func removeImage() { let text = self.text self.attributedText = nil self.text = text } } 
+16
source

Request Regis St-Gelais extension for Swift 3 and Swift 4 and without forced deployment:

 extension UILabel { func addImageWith(name: String, behindText: Bool) { let attachment = NSTextAttachment() attachment.image = UIImage(named: name) let attachmentString = NSAttributedString(attachment: attachment) guard let txt = self.text else { return } if behindText { let strLabelText = NSMutableAttributedString(string: txt) strLabelText.append(attachmentString) self.attributedText = strLabelText } else { let strLabelText = NSAttributedString(string: txt) let mutableAttachmentString = NSMutableAttributedString(attributedString: attachmentString) mutableAttachmentString.append(strLabelText) self.attributedText = mutableAttachmentString } } func removeImage() { let text = self.text self.attributedText = nil self.text = text } } 

Using:

 self.theLabel.text = "desiredText" self.theLabel.addImageWith(name: "nameOfImage", behindText: false) 
+5
source

Edit 03/19/18: Correct the error when imageBehindText = false + Image size in pixel there is no dot.

Update David function for multiple images with text preservation and image size based on font size (Swift 4):

 extension UILabel { /** This function adding image with text on label. - parameter text: The text to add - parameter image: The image to add - parameter imageBehindText: A boolean value that indicate if the imaga is behind text or not - parameter keepPreviousText: A boolean value that indicate if the function keep the actual text or not */ func addTextWithImage(text: String, image: UIImage, imageBehindText: Bool, keepPreviousText: Bool) { let lAttachment = NSTextAttachment() lAttachment.image = image // 1pt = 1.32px let lFontSize = round(self.font.pointSize * 1.32) let lRatio = image.size.width / image.size.height lAttachment.bounds = CGRect(x: 0, y: ((self.font.capHeight - lFontSize) / 2).rounded(), width: lRatio * lFontSize, height: lFontSize) let lAttachmentString = NSAttributedString(attachment: lAttachment) if imageBehindText { let lStrLabelText: NSMutableAttributedString if keepPreviousText, let lCurrentAttributedString = self.attributedText { lStrLabelText = NSMutableAttributedString(attributedString: lCurrentAttributedString) lStrLabelText.append(NSMutableAttributedString(string: text)) } else { lStrLabelText = NSMutableAttributedString(string: text) } lStrLabelText.append(lAttachmentString) self.attributedText = lStrLabelText } else { let lStrLabelText: NSMutableAttributedString if keepPreviousText, let lCurrentAttributedString = self.attributedText { lStrLabelText = NSMutableAttributedString(attributedString: lCurrentAttributedString) lStrLabelText.append(NSMutableAttributedString(attributedString: lAttachmentString)) lStrLabelText.append(NSMutableAttributedString(string: text)) } else { lStrLabelText = NSMutableAttributedString(attributedString: lAttachmentString) lStrLabelText.append(NSMutableAttributedString(string: text)) } self.attributedText = lStrLabelText } } func removeImage() { let text = self.text self.attributedText = nil self.text = text } } 
0
source

Source: https://habr.com/ru/post/1206198/


All Articles