как изменить размер изображения или сделать как NSAttributedString NSTextAttachment (или установить его начальный размер)

У меня есть NSAttributedString, к которому я добавляю NSTextAttachment. Размер изображения 50 на 50 часов, но я бы хотел, чтобы оно уменьшилось, чтобы отразить высоту строки приписываемой строки. Я думал, что это будет сделано автоматически, но я думаю, что нет. Я просмотрел ссылку на класс UImage, но это изображение, похоже, не установлено в UIImageView, поэтому нет доступа к свойству фрейма. Вот скриншот того, что у меня сейчас есть:

введите описание изображения здесь

В идеальном мире я также хотел бы реализовать способ увеличения изображения на основе пользовательского ввода (например, увеличения размера шрифта). Есть идеи, как этого добиться?

Спасибо

редактировать 1

вот как я его создаю:

    NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
    textAttachment.image = [UIImage imageNamed:@"note-small.png"];
    NSLog(@"here is the scale: %f", textAttachment.image.scale);
    NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];
    [headerAS replaceCharactersInRange:NSMakeRange([headerAS length], 0) withString:@" "];
    [headerAS replaceCharactersInRange:NSMakeRange([headerAS length], 0) withAttributedString:attrStringWithImage];

person timpone    schedule 12.03.2014    source источник
comment
Это поможет вам stackoverflow.com/questions/26105803/   -  person Vinayak    schedule 30.03.2016


Ответы (5)


Посмотрите на создание подклассов NSTextAttachment и реализацию методов NSTextAttachmentContainer для возврата разных размеров в зависимости от предоставленного текстового контейнера. По умолчанию NSTextAttachment просто возвращает размер предоставленного изображения.

person Wain    schedule 12.03.2014
comment
См. attachment.bounds - person Mr. Ming; 26.08.2015

Вы должны установить границы формы прикрепления, чтобы изменить размер изображения следующим образом:

attachment.bounds = CGRectMake(0, 0, yourImgWidth, yourImgHeight)

person Dung Nguyen    schedule 16.12.2015
comment
Прекрасно работает! Спасибо! - person The Interloper; 30.08.2018

Если вам нужно изменить размер кучи NSTextAttachment изображений, сохранив их соотношение сторон, я написал удобное расширение: http://hack.swic.name/convenient-nstextattachment-image-resizing

extension NSTextAttachment {
    func setImageHeight(height: CGFloat) {
        guard let image = image else { return }
        let ratio = image.size.width / image.size.height

        bounds = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: ratio * height, height: height)
    }
}

Пример использования:

let textAttachment = NSTextAttachment()
textAttachment.image = UIImage(named: "Image")
textAttachment.setImageHeight(16) // Whatever you need to match your font

let imageString = NSAttributedString(attachment: textAttachment)
yourAttributedString.appendAttributedString(imageString)
person Maciej Swic    schedule 19.02.2016

Swift4, если вам нужна строка с атрибутами вместе с изображением или значком.

здесь вы можете сделать что-то вроде этого.

func AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1 : UIImage , AttributedText : String ,AttributeImage2 : UIImage,  LabelBound : UILabel) -> NSMutableAttributedString
{
    let fullString = NSMutableAttributedString(string: "  ")
    let image1Attachment = NSTextAttachment()
    image1Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage1.size.height).rounded() / 2, width: AttributeImage1.size.width, height: AttributeImage1.size.height)
    image1Attachment.image = AttributeImage1
    let image1String = NSAttributedString(attachment: image1Attachment)
    let image2Attachment = NSTextAttachment()
    image2Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage2.size.height).rounded() / 2, width: AttributeImage2.size.width, height: AttributeImage2.size.height)
    image2Attachment.image = AttributeImage2
    let image2String = NSAttributedString(attachment: image2Attachment)
    fullString.append(image1String)
    fullString.append(NSAttributedString(string: AttributedText))
    fullString.append(image2String)
    return fullString
}

вы можете использовать этот код, как указано ниже:

        self.lblMid.attributedText = AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1: #imageLiteral(resourceName: "Left") , AttributedText: "  Payment Details  ", AttributeImage2: #imageLiteral(resourceName: "RIght") , LabelBound: self.lblMid)

здесь вы можете добавлять изображения, которые вы можете заменить своими собственными:

Изображение слева  введите описание изображения здесь

Изображение справа  введите описание изображения здесь

Вывод будет таким:  введите описание изображения здесь

person Azharhussain Shaikh    schedule 08.06.2018

NSTextAtatchment - это просто держатель для UIImage, поэтому масштабируйте изображение, когда ему нужно масштабирование, и воссоздайте текстовое вложение или установите его изображение. Вам нужно будет принудительно обновить nslayout, если вы измените изображение в существующем текстовом вложении.

person scottdev    schedule 25.05.2014