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

AVEbrahimi
sumber
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;
Scott Berrevoets
sumber
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

Tarun Seera
sumber
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
André Dos Santos
sumber
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];
Beberapa pria
sumber
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
    }
}
RajeshKumar R
sumber
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

anatoliy_v
sumber
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
  }
}
Agen Smith
sumber
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
Phil
sumber
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.

nanothread59
sumber
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];
pengguna1673099
sumber
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

Shakeel Ahmed
sumber
1

Anda bisa menggunakan UITextField dengan properti leftView dan kemudian setel enabledproperti keNO

Atau gunakan UIButton dansetImage:forControlState

liamnichols
sumber
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.

Fennec
sumber
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
    }
}
Gary Mansted
sumber
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

Ayush Dixit
sumber
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

Mirko Catalano
sumber