Come incorporare una piccola icona in UILabel


153

Ho bisogno di incorporare piccole icone (una specie di proiettili personalizzati) sul mio UILabelin iOS7. Come posso farlo in Interface Designer? O almeno nel codice?

In Android ci sono leftDrawablee rightDrawableper le etichette, ma come si fa in iOS? Esempio in Android:

campione Android


Non ho familiarità con Android puoi pubblicare qualche immagine di riferimento?
user1673099

2
creare una piccola visualizzazione di immagini e aggiungerla come sottoview all'oggetto etichetta
Saurabh Passolia,

Risposte:


292

Puoi farlo con gli allegati di testo di iOS 7 , che fanno parte di TextKit. Qualche codice di esempio:

NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"MyIcon.png"];

NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];

NSMutableAttributedString *myString= [[NSMutableAttributedString alloc] initWithString:@"My label text"];
[myString appendAttributedString:attachmentString];

myLabel.attributedText = myString;

Che ne dici di iOS6? Hai qualche suggerimento?? Grazie
Steven Jiang,

1
@StevenJiang: Devi solo aggiungere un UIImageViewalla tua etichetta
Scott Berrevoets,

1
Purtroppo questo posiziona l'icona dopo il testo. Qualche possibilità che possiamo spostarlo prima del testo perché non riesco a trovare un modo ?!
rispondi il

4
@reVerse Invece di aggiungere l'immagine (stringa di allegato) alla tua stringa testuale, puoi provare a fare il contrario, quindi aggiungendo la stringa testuale alla stringa di allegato.
Scott Berrevoets,

11
Lo ho già provato ieri. Sembra una cosa persa perché ora funziona. Grazie. Per ogni evenienza per tutti coloro che stanno cercando di ottenere lo stesso risultato (dato che è leggermente diverso): NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment]; NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithAttributedString:attachmentString]; NSAttributedString *myText = [[NSMutableAttributedString alloc] initWithString:text]; [myString appendAttributedString:myText];
rispondi il

153

Ecco il modo per incorporare l'icona in UILabel.

Anche per allineare l'icona, usa attach.bounds


Swift 5.1

// Create Attachment
let imageAttachment = NSTextAttachment()
imageAttachment.image = UIImage(named:"iPhoneIcon")
// Set bound to reposition
let imageOffsetY: CGFloat = -5.0
imageAttachment.bounds = CGRect(x: 0, y: imageOffsetY, width: imageAttachment.image!.size.width, height: imageAttachment.image!.size.height)
// Create string with attachment
let attachmentString = NSAttributedString(attachment: imageAttachment)
// Initialize mutable string
let completeText = NSMutableAttributedString(string: "")
// Add image to mutable string
completeText.append(attachmentString)
// Add your text to mutable string
let textAfterIcon = NSAttributedString(string: "Using attachment.bounds!")
completeText.append(textAfterIcon)
self.mobileLabel.textAlignment = .center
self.mobileLabel.attributedText = completeText

Versione Objective-C

NSTextAttachment *imageAttachment = [[NSTextAttachment alloc] init];
imageAttachment.image = [UIImage imageNamed:@"iPhoneIcon"];
CGFloat imageOffsetY = -5.0;
imageAttachment.bounds = CGRectMake(0, imageOffsetY, imageAttachment.image.size.width, imageAttachment.image.size.height);
NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:imageAttachment];
NSMutableAttributedString *completeText = [[NSMutableAttributedString alloc] initWithString:@""];
[completeText appendAttributedString:attachmentString];
NSAttributedString *textAfterIcon = [[NSAttributedString alloc] initWithString:@"Using attachment.bounds!"];
[completeText appendAttributedString:textAfterIcon];
self.mobileLabel.textAlignment = NSTextAlignmentRight;
self.mobileLabel.attributedText = completeText;

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


22
Vota per attaccamento.
Peter Zhao,

3
Ottima chiamata sull'utilizzo di attachio.bounds. Questo è esattamente quello che stavo cercando.
Geoherna,

2
In effetti, imageOffsetY può essere calcolato invece di utilizzare un valore fisso di -5,0. lasciare imageOffsetY: CGFloat = - (imageAttachment.image! .size.height - self.mobileLabel.font.pointSize) / 2.0;
JonSlowCN il

Nota: rallenta il tempo di compilazione
Jack

Posso farlo sullo storyboard?
Augusto

53

Swift 4.2:

let attachment = NSTextAttachment()        
attachment.image = UIImage(named: "yourIcon.png")
let attachmentString = NSAttributedString(attachment: attachment)
let myString = NSMutableAttributedString(string: price)
myString.append(attachmentString)
label.attributedText = myString

23

L'immagine di riferimento appare come un pulsante. Prova (può essere fatto anche in Interface Builder):

inserisci qui la descrizione dell'immagine

UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(50, 50, 100, 44)];
[button setImage:[UIImage imageNamed:@"img"] forState:UIControlStateNormal];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, -30, 0, 0)];
[button setTitle:@"Abc" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor yellowColor]];
[view addSubview:button];

Ben spiegato, mi piace il fatto che hai impiegato del tempo per fornire un riferimento. Mi ha aiutato molto! Grazie
Shinnyx il

Questo mi ha aiutato a mettere l'icona del mio trofeo in un pulsante. Molte grazie!
Harish,

23

Versione Swift 3

let attachment = NSTextAttachment()
attachment.image = UIImage(named: "plus")
attachment.bounds = CGRect(x: 0, y: 0, width: 10, height: 10)
let attachmentStr = NSAttributedString(attachment: attachment)
let myString = NSMutableAttributedString(string: "")
myString.append(attachmentStr)
let myString1 = NSMutableAttributedString(string: "My label text")
myString.append(myString1)
lbl.attributedText = myString

Estensione UILabel

extension UILabel {

    func set(text:String, leftIcon: UIImage? = nil, rightIcon: UIImage? = nil) {

        let leftAttachment = NSTextAttachment()
        leftAttachment.image = leftIcon
        leftAttachment.bounds = CGRect(x: 0, y: -2.5, width: 20, height: 20)
        if let leftIcon = leftIcon {
            leftAttachment.bounds = CGRect(x: 0, y: -2.5, width: leftIcon.size.width, height: leftIcon.size.height)
        }
        let leftAttachmentStr = NSAttributedString(attachment: leftAttachment)

        let myString = NSMutableAttributedString(string: "")

        let rightAttachment = NSTextAttachment()
        rightAttachment.image = rightIcon
        rightAttachment.bounds = CGRect(x: 0, y: -5, width: 20, height: 20)
        let rightAttachmentStr = NSAttributedString(attachment: rightAttachment)


        if semanticContentAttribute == .forceRightToLeft {
            if rightIcon != nil {
                myString.append(rightAttachmentStr)
                myString.append(NSAttributedString(string: " "))
            }
            myString.append(NSAttributedString(string: text))
            if leftIcon != nil {
                myString.append(NSAttributedString(string: " "))
                myString.append(leftAttachmentStr)
            }
        } else {
            if leftIcon != nil {
                myString.append(leftAttachmentStr)
                myString.append(NSAttributedString(string: " "))
            }
            myString.append(NSAttributedString(string: text))
            if rightIcon != nil {
                myString.append(NSAttributedString(string: " "))
                myString.append(rightAttachmentStr)
            }
        }
        attributedText = myString
    }
}

17

Ho implementato rapidamente questa funzione qui: https://github.com/anatoliyv/SMIconLabel

Il codice è il più semplice possibile:

var labelLeft = SMIconLabel(frame: CGRectMake(10, 10, view.frame.size.width - 20, 20))
labelLeft.text = "Icon on the left, text on the left"

// Here is the magic
labelLeft.icon = UIImage(named: "Bell") // Set icon image
labelLeft.iconPadding = 5               // Set padding between icon and label
labelLeft.numberOfLines = 0             // Required
labelLeft.iconPosition = SMIconLabelPosition.Left // Icon position
view.addSubview(labelLeft)

Ecco come appare:

Immagine SMIconLabel


13

Swift 4 UIlabel Extension per aggiungere l'immagine all'etichetta con riferimento alle risposte sopra

extension UILabel {
  func set(image: UIImage, with text: String) {
    let attachment = NSTextAttachment()
    attachment.image = image
    attachment.bounds = CGRect(x: 0, y: 0, width: 10, height: 10)
    let attachmentStr = NSAttributedString(attachment: attachment)

    let mutableAttributedString = NSMutableAttributedString()
    mutableAttributedString.append(attachmentStr)

    let textString = NSAttributedString(string: text, attributes: [.font: self.font])
    mutableAttributedString.append(textString)

    self.attributedText = mutableAttributedString
  }
}

NSAttributedString(string: " " + text, attributes: [.font: self.font])
Farzad,

@grizzly è quello per creare spazio tra icona e testo?
Agente Smith,

sì. è un altro modo di spazio tra icona e testo?
Farzad,

4

Versione Swift 2.0:

//Get image and set it's size
let image = UIImage(named: "imageNameWithHeart")
let newSize = CGSize(width: 10, height: 10)

//Resize image
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
image?.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let imageResized = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

//Create attachment text with image
var attachment = NSTextAttachment()
attachment.image = imageResized
var attachmentString = NSAttributedString(attachment: attachment)
var myString = NSMutableAttributedString(string: "I love swift ")
myString.appendAttributedString(attachmentString)
myLabel.attributedText = myString

3

Prova a trascinare a UIViewsullo schermo in IB. Da lì puoi trascinare un UIImageViewe UILabelnella vista che hai appena creato. Imposta l'immagine della UIImageViewfinestra di ispezione Proprietà come immagine bullet personalizzata (che dovrai aggiungere al tuo progetto trascinandola nel riquadro di navigazione) e puoi scrivere del testo nell'etichetta.


2

prova in questo modo ...

  self.lbl.text=@"Drawble Left";
    UIImageView *img=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)];
    img.image=[UIImage imageNamed:@"Star.png"];
    [self.lbl addSubview:img];

Ti è utile?
user1673099

questo approccio manca l'offset del testo per l'immagine (il testo si trova dietro l'immagine)
brigadir

2

Swift 5 Easy Way Basta CopyPaste e cambia quello che vuoi

let fullString = NSMutableAttributedString(string:"To start messaging contacts who have Talklo, tap ")

 // create our NSTextAttachment
let image1Attachment = NSTextAttachment() 
image1Attachment.image = UIImage(named: "chatEmoji")
image1Attachment.bounds = CGRect(x: 0, y: -8, width: 25, height: 25)

// wrap the attachment in its own attributed string so we can append it
let image1String = NSAttributedString(attachment: image1Attachment)

 // add the NSTextAttachment wrapper to our full string, then add some more text.

 fullString.append(image1String)
 fullString.append(NSAttributedString(string:" at the right bottom of your screen"))

 // draw the result in a label
 self.lblsearching.attributedText = fullString

inserisci qui la descrizione dell'immagine



1

In Swift 2.0,

La mia soluzione al problema è una combinazione di un paio di risposte su questa domanda. Il problema che ho dovuto affrontare nella risposta di @ Phil era che non potevo cambiare la posizione dell'icona, che appariva sempre nell'angolo destro. E l'unica risposta di @anatoliy_v, non sono riuscito a ridimensionare la dimensione dell'icona che voglio aggiungere alla stringa.

Per farlo funzionare per me, ho prima fatto un pod 'SMIconLabel'e poi creato questa funzione:

func drawTextWithIcon(labelName: SMIconLabel, imageName: String, labelText: String!,  width: Int, height: Int) {

        let newSize = CGSize(width: width, height: height)
        let image = UIImage(named: imageName)
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        image?.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
        let imageResized = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        labelName.text = " \(labelText)"
        labelName.icon = imageResized
        labelName.iconPosition = .Left
    }

Questa soluzione non solo ti aiuterà a posizionare l'immagine, ma ti consentirà anche di apportare le modifiche necessarie alla dimensione dell'icona e ad altri attributi.

Grazie.


1

Estensione Swift 3 UILabel

Suggerimento: se hai bisogno di spazio tra l'immagine e il testo, utilizza uno o due spazi prima dell'etichetta Testo.

extension UILabel {
    func addIconToLabel(imageName: String, labelText: String, bounds_x: Double, bounds_y: Double, boundsWidth: Double, boundsHeight: Double) {
        let attachment = NSTextAttachment()
        attachment.image = UIImage(named: imageName)
        attachment.bounds = CGRect(x: bounds_x, y: bounds_y, width: boundsWidth, height: boundsHeight)
        let attachmentStr = NSAttributedString(attachment: attachment)
        let string = NSMutableAttributedString(string: "")
        string.append(attachmentStr)
        let string2 = NSMutableAttributedString(string: labelText)
        string.append(string2)
        self.attributedText = string
    }
}

1
L'ho usato e ha funzionato perfettamente. Gli altri sopra in realtà hanno capovolto l'immagine fino alla fine della stringa.
mondousage

1
 func atributedLabel(str: String, img: UIImage)->NSMutableAttributedString
{   let iconsSize = CGRect(x: 0, y: -2, width: 16, height: 16)
    let attributedString = NSMutableAttributedString()
    let attachment = NSTextAttachment()
    attachment.image = img
    attachment.bounds = iconsSize
    attributedString.append(NSAttributedString(attachment: attachment))
    attributedString.append(NSAttributedString(string: str))

    return attributedString
} 

È possibile utilizzare questa funzione per aggiungere immagini o piccole icone all'etichetta


Chiamalo in viewdidload ()
Ayush Dixit il

let emojisCollection = [UIImage (chiamato: "ic_place"), UIImage (chiamato: "ic_group"), UIImage (chiamato: "ic_analytics")] lbl1.attributedText = atributedLabel (str: "Howath, Dublin", img: emojisCollection [0 ]!) lbl2.attributedText = atributedLabel (str: "Difficoltà: 18+", img: emojisCollection [2]!) lbl3.attributedText = atributedLabel (str: "Dimensione massima del gruppo: 10", img: emojisCollection [1]!)
Ayush Dixit,

puoi modificare la risposta originale per includere quei commenti sopra.
Moondra,

0

devi creare un oggetto personalizzato dove hai usato a UIViewe al suo interno metti a UIImageViewe aUILabel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.