Cara menanamkan ikon kecil di UILabel


153

Saya perlu menyematkan ikon kecil (semacam peluru khusus) ke saya UILabeldi iOS7. Bagaimana saya bisa melakukan ini di desainer antarmuka? Atau setidaknya dalam kode?

Di Android ada leftDrawabledan rightDrawableuntuk label, tetapi bagaimana hal itu dilakukan di iOS? Contoh di android:

sampel android


Saya tidak familier dengan Android, bisakah Anda memposting beberapa gambar untuk referensi?
user1673099

2
buat imageview kecil dan tambahkan sebagai subview ke objek label
Saurabh Passolia

Jawaban:


292

Anda dapat melakukan ini dengan lampiran teks iOS 7 , yang merupakan bagian dari TextKit. Beberapa kode contoh:

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;

Bagaimana dengan iOS6? Apakah anda memiliki saran?? Thx
Steven Jiang

1
@StevenJiang: Anda harus menambahkan saja UIImageViewke label Anda
Scott Berrevoets

1
Sayangnya ini menempatkan ikon setelah teks. Apakah ada kemungkinan kita dapat memindahkan ini sebelum teks karena saya tidak dapat menemukan jalan ?!
Kembalikan

4
@reVerse Alih-alih menambahkan gambar (string lampiran) ke string teks Anda, Anda bisa mencobanya sebaliknya, jadi menambahkan string teks ke string lampiran.
Scott Berrevoets

11
Sudah mencobanya kemarin. Sepertinya ada yang terlewat karena sekarang sudah berfungsi. Terima kasih. Untuk berjaga-jaga bagi semua orang yang mencoba melakukan hal yang sama (karena sedikit berbeda): NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment]; NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithAttributedString:attachmentString]; NSAttributedString *myText = [[NSMutableAttributedString alloc] initWithString:text]; [myString appendAttributedString:myText];
kembalikan

153

Inilah cara menanamkan ikon di UILabel.

Juga untuk Sejajarkan Ikon menggunakan attachment.bounds


Cepat 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

Versi 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;

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


22
Vote up for attachment.bounds
Peter Zhao

3
Panggilan hebat menggunakan attachment.bounds. Itulah tepatnya yang saya cari.
Geoherna

2
Bahkan, imageOffsetY dapat dihitung alih-alih menggunakan nilai tetap -5,0. biarkan imageOffsetY: CGFloat = - (imageAttachment.image! .size.height - self.mobileLabel.font.pointSize) / 2.0;
JonSlowCN

Catatan: memperlambat waktu kompilasi
Jack

Saya bisa melakukannya di 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

Gambar referensi Anda terlihat seperti tombol. Coba (bisa juga dilakukan di Interface Builder):

masukkan deskripsi gambar di sini

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];

Dijelaskan dengan baik, saya suka fakta Anda meluangkan waktu untuk memberikan referensi. Itu banyak membantu saya! Terima kasih
Shinnyx

Ini membantu saya mendapatkan ikon trofi saya menjadi sebuah tombol. Terima kasih banyak!
Harish

23

Versi 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

Ekstensi 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

Saya telah mengimplementasikan fitur ini dengan cepat di sini: https://github.com/anatoliyv/SMIconLabel

Kode sesederhana mungkin:

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)

Berikut tampilannya:

Gambar SMIconLabel


13

UIlabelEkstensi Swift 4 untuk menambahkan Gambar ke Label dengan mengacu pada jawaban di atas

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 adalah untuk menciptakan ruang antara ikon dan teks?
Agen Smith

Iya. Apakah cara lain untuk ruang antara ikon dan teks?
Farzad

4

Versi 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

Coba seret UIViewlayar ke dalam IB. Dari sana Anda dapat menarik UIImageViewdan UILabelke tampilan yang baru saja Anda buat. Setel gambar UIImageViewpada properti inspektur sebagai gambar peluru khusus (yang harus Anda tambahkan ke proyek Anda dengan menyeretnya ke panel navigasi) dan Anda dapat menulis beberapa teks dalam label.


2

coba dengan cara ini ...

  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];

Apakah ini membantu Anda?
user1673099

pendekatan ini melewatkan offset teks untuk gambar (teks terletak di belakang gambar)
brigadir

2

Swift 5 Easy Way Cukup CopyPaste dan ubah yang Anda inginkan

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

masukkan deskripsi gambar di sini



1

Di Swift 2.0,

Solusi saya untuk masalah ini adalah kombinasi dari beberapa jawaban untuk pertanyaan ini. Masalah yang saya hadapi dalam jawaban @ Phil adalah bahwa saya tidak dapat mengubah posisi ikon, dan selalu muncul di sudut kanan. Dan satu jawaban dari @anatoliy_v, saya tidak dapat mengubah ukuran ukuran ikon yang ingin saya tambahkan ke string.

Untuk membuatnya bekerja untuk saya, saya pertama kali melakukan pod 'SMIconLabel'dan kemudian membuat fungsi ini:

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
    }

Solusi ini tidak hanya akan membantu Anda menempatkan gambar tetapi juga akan memungkinkan Anda untuk melakukan perubahan yang diperlukan pada ukuran ikon dan atribut lainnya.

Terima kasih.


1

Swift 3 ekstensi UILabel

Kiat: Jika Anda membutuhkan ruang antara gambar dan teks, gunakan satu atau dua spasi sebelum labelText.

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
Saya menggunakan ini dan itu bekerja dengan sempurna. Yang lain di atas sebenarnya membalik gambar ke akhir string.
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
} 

Anda dapat menggunakan fungsi ini untuk menambahkan gambar atau ikon kecil ke label


Sebut ini di viewdidload ()
Ayush Dixit

biarkan emojisCollection = [UIImage (dinamai: "ic_place"), UIImage (dinamai: "ic_group"), UIImage (bernama: "ic_analytics")] lbl1.attributedText = atributedLabel (str: "Howath, Dublin", img: emojisCollection [0 ]!) lbl2.attributedText = atributedLabel (str: "Kesulitan: 18+", img: emojisCollection [2]!) lbl3.attributedText = atributedLabel (str: "Ukuran grup maksimum: 10", img: emojisCollection [1]!)
Ayush Dixit

Anda dapat mengedit jawaban asli Anda untuk memasukkan komentar-komentar di atas.
Moondra

0

Anda harus membuat objek khusus tempat Anda menggunakan a UIViewdan di dalamnya Anda meletakkan a UIImageViewdan aUILabel

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.