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

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

enter image description here

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

ТНХ

изменить 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];

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

Если вам нужно изменить размер связки 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)

Ответ 4

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