Как включить 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
}
}