Как включить UITextView для получения вставленных изображений

Мне нужно поддержать вставку изображений в UITextView, С изображением, скопированным в буфер обмена,Paste"опция не появляется. Она появляется, когда в буфере обмена есть текст.

Это как переопределить paste вариант в кастоме UITextView, Но мне нужна помощь о том, как получить возможность появиться для начала...

// This gets called when user presses menu "Paste" option
- (void)paste:(id)sender{

    UIImage *image = [UIPasteboard generalPasteboard].image;

    if (image) {
        NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
        textAttachment.image = image;
        NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:textAttachment];
        self.attributedText = imageString;
    } else {
        // Call the normal paste action
        [super paste:sender];
    }
}

Я натолкнулся на несколько связанных вопросов, но они не помогли неопытному разработчику, такому как я: Как заставить UIMenuController работать для настраиваемого представления? Как вставить изображение из картона на UITextView?

2 ответа

Решение

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

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(paste:) && [UIPasteboard generalPasteboard].image)
        return YES;
    else
        return [super canPerformAction:action withSender:sender];
}

Пожалуйста.

Спасибо @Matt, ваш ответ мне помог. Просто расширяю свой ответ, который может кому-то помочь,

Подкласс UITextview, который показывает опцию вставки при долгом нажатии, когда у вас есть изображение на монтажном столе.

      class MyTextView:UITextView {
    var onPasteImage:(()->Void)?
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(paste(_:)) && UIPasteboard.general.image != nil {
            return true
        }else{
            return super.canPerformAction(action, withSender: sender)
        }
    }
    
    override func paste(_ sender: Any?) {
        super.paste(sender)
        if UIPasteboard.general.image != nil {
            onPasteImage?()
        }
    }
}

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

      inputFieldForReply.textView.onPasteImage = { [weak self] in
    if let image = UIPasteboard.general.image {
        // Process pasted image
    }
}
Другие вопросы по тегам