Как вставить изображение из картона на UITextView?

У меня есть следующий код на клавиатуре extensión

let pasteboard = UIPasteboard.generalPasteboard()
var image = UIImage(named: "myimage");
pasteboard.image = image;

Это не работает на UITextView У меня в приложении-контейнере никогда не появляется контекстное меню вставки. Он работает на других приложениях, таких как "сообщения", но не на моем.

Мой код работает, если я пытаюсь вставить текст вместо изображения, используя string собственность, так что я совсем рядом.

Мне может понадобиться настроить мой текстовый вид иначе, но я не знаю как. Я изменил "Текст" с "Обычный" на "Приписан", но все еще не работает.

3 ответа

Решение

UITextView поддерживает только вставку текста из коробки. Вы можете создать его подкласс и добавить поддержку для вставки изображений, которая может быть реализована с использованием текстовых вложений с атрибутами.

Рецензия Н.С.Хипстера на UIMenuController и этот вопрос переполнения стека объясняет логику вставки.

Это не работает, если реализовано в подклассе UITextView, но я попробовал это в UIViewController, содержащем textView, и это сработало:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {

    if (action == @selector(paste:)) {
        return [UIPasteboard generalPasteboard].string != nil || [UIPasteboard generalPasteboard].image != nil;
        //if you want to do this for specific textView add && [yourTextView isFirstResponder] to if statement
    }

    return [super canPerformAction:action withSender:sender];

}

-(void)paste:(id)sender {
    //do your action here
}

Создать NSTextAttachment из изображения и приписанной строки с TextAttachment. Затем установите свойство attributeText для UITextView, Подкласс UITextView и переопределить paste(_:) метод:

override func paste(_ sender: Any?) {
    let textAttachment = NSTextAttachment()
    textAttachment.image = UIPasteboard.general.image
    attributedText = NSAttributedString(attachment: textAttachment)
}
Другие вопросы по тегам