Cách nhúng biểu tượng nhỏ trong UILabel


153

Tôi cần nhúng các biểu tượng nhỏ (loại đạn tùy chỉnh) UILabelvào iOS7. Làm thế nào tôi có thể làm điều này trong thiết kế giao diện? Hoặc ít nhất là trong mã?

Trong Android có leftDrawablerightDrawablecho nhãn, nhưng làm thế nào nó được thực hiện trong iOS? Mẫu trong Android:

mẫu android


Tôi không quen thuộc với Android, bạn có thể đăng một số hình ảnh để tham khảo không?
dùng1673099

2
tạo một lượt xem hình ảnh nhỏ và thêm nó dưới dạng
khung nhìn

Câu trả lời:


292

Bạn có thể làm điều này với tệp đính kèm văn bản của iOS 7 , một phần của TextKit. Một số mã mẫu:

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;

Còn iOS6 thì sao? Bạn có gợi ý nào không?? Thx
Steven Jiang

1
@StevenJiang: Bạn sẽ chỉ cần thêm một UIImageViewnhãn của bạn
Scott Berrevoets

1
Thật không may, điều này đặt biểu tượng sau văn bản. Bất cứ cơ hội nào chúng ta có thể di chuyển cái này trước văn bản vì tôi không thể tìm ra cách nào?!
xác minh lại

4
@reVerse Thay vì nối thêm hình ảnh (chuỗi đính kèm) vào chuỗi văn bản của bạn, bạn có thể thử theo cách khác, vì vậy hãy thêm chuỗi văn bản vào chuỗi đính kèm.
Scott Berrevoets

11
Đã thử điều này ngày hôm qua. Có vẻ như bỏ lỡ một cái gì đó bởi vì bây giờ nó hoạt động. Cảm ơn. Chỉ trong trường hợp cho tất cả những người đang cố gắng thực hiện như nhau (vì nó hơi khác nhau): NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment]; NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithAttributedString:attachmentString]; NSAttributedString *myText = [[NSMutableAttributedString alloc] initWithString:text]; [myString appendAttributedString:myText];
Xác minh lại

153

Đây là cách để nhúng biểu tượng trong UILabel.

Ngoài ra, để căn chỉnh Biểu tượng, hãy sử dụng tệp đính kèm.


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

Phiên bản khách quan-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;

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


22
Bỏ phiếu cho tệp đính kèm
Phạm vi

3
Cuộc gọi tuyệt vời về việc sử dụng tệp đính kèm. Đó chính xác là những gì tôi đang tìm kiếm.
Geoherna

2
Trong thực tế, imagePacksetY có thể được tính thay vì sử dụng giá trị cố định là -5.0. hãy để image OffersetY: CGFloat = - (imageAttachment.image! .size.height - self.mobileLabel.font.pointSize) / 2.0;
JonSlowCN

Lưu ý: nó làm chậm thời gian biên dịch
Jack

Tôi có thể làm điều đó trên bảng phân cảnh?
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

Hình ảnh tham khảo của bạn trông giống như một nút. Thử (cũng có thể được thực hiện trong Trình tạo giao diện):

nhập mô tả hình ảnh ở đây

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

Giải thích rõ ràng, tôi thích thực tế bạn đã dành thời gian để cung cấp một ref. Nó đã giúp tôi rất nhiều! Cảm ơn
Shinnyx 04/07 '

Điều này đã giúp đưa biểu tượng chiến lợi phẩm của tôi vào một nút. Cảm ơn rất nhiều!
Harish

23

Phiên bản 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

Mở rộng 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

Tôi đã thực hiện tính năng này nhanh chóng tại đây: https://github.com/anatoliyv/SMIconLabel

Mã đơn giản nhất có thể:

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)

Đây là cách nó trông:

Hình ảnh SMIconLabel


13

UIlabelTiện ích mở rộng Swift 4 để thêm hình ảnh vào nhãn với tham chiếu các câu trả lời ở trên

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 là để tạo không gian giữa biểu tượng và văn bản?
Đặc vụ Smith

Đúng. là một cách khác cho không gian giữa biểu tượng và văn bản?
Farzad

4

Phiên bản 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

Hãy thử kéo a UIViewlên màn hình trong IB. Từ đó bạn có thể kéo một UIImageViewUILabelvào khung nhìn bạn vừa tạo. Đặt hình ảnh của trình UIImageViewkiểm tra thuộc tính làm hình ảnh dấu đầu dòng tùy chỉnh (bạn sẽ phải thêm vào dự án của mình bằng cách kéo nó vào khung điều hướng) và bạn có thể viết một số văn bản trong nhãn.


2

thử cách này ...

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

Điều này có hữu ích cho bạn không?
dùng1673099

Cách tiếp cận này bỏ qua phần bù văn bản cho hình ảnh (văn bản nằm phía sau hình ảnh)
brigadir

2

Swift 5 Easy Way Chỉ cần CopyPaste và thay đổi những gì bạn muốn

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

nhập mô tả hình ảnh ở đây



1

Trong Swift 2.0,

Giải pháp của tôi cho vấn đề này là sự kết hợp của một vài câu trả lời cho câu hỏi này. Vấn đề tôi gặp phải trong câu trả lời của @ Phil là tôi không thể thay đổi vị trí của biểu tượng và nó luôn xuất hiện ở góc bên phải. Và một câu trả lời từ @anatoliy_v, tôi không thể thay đổi kích thước kích thước biểu tượng mà tôi muốn nối vào chuỗi.

Để làm cho nó hoạt động với tôi, trước tiên tôi đã làm một pod 'SMIconLabel'và sau đó tạo ra chức năng này:

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
    }

Giải pháp này không chỉ giúp bạn đặt hình ảnh mà còn cho phép bạn thực hiện các thay đổi cần thiết đối với kích thước biểu tượng và các thuộc tính khác.

Cảm ơn bạn.


1

Gia hạn Swift 3 UILabel

Mẹo: Nếu bạn cần một khoảng trống giữa hình ảnh và văn bản, chỉ cần sử dụng một hoặc hai khoảng trắng trước nhãn.

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
Tôi đã sử dụng nó và nó hoạt động hoàn hảo. Những cái khác ở trên thực sự lật hình ảnh đến cuối chuỗi.
thứ hai

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
} 

Bạn có thể sử dụng chức năng này để thêm hình ảnh hoặc biểu tượng nhỏ vào nhãn


Gọi cái này trong viewdidload ()
Ayush Dixit

let emojisCollection = [UIImage (tên: "ic_place"), UIImage (có tên: "ic_group"), UIImage (có tên: "ic_analytics")] lbl1.attributionText = atributionLabel (str: "Howath, Dublin" ]!) lbl2.attributionText = atributionLabel (str: "Khó: 18+", img: emojisCollection [2]!) lbl3.attributionText = atributionLabel (str: "Kích thước nhóm tối đa: 10", img: emojisCollection [1]!
Ayush Dixit

bạn có thể chỉnh sửa câu trả lời ban đầu của bạn để bao gồm những ý kiến ​​trên.
Moondra

0

bạn phải tạo một đối tượng tùy chỉnh nơi bạn đã sử dụng UIViewvà bên trong bạn đặt một UIImageViewvà mộtUILabel

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.