Какое событие запускается, когда блок текста вставляется в UITextView? Мне нужно изменить кадр моего textView, когда текст вставлен.
Спасибо за чтение.
Какое событие запускается, когда блок текста вставляется в UITextView? Мне нужно изменить кадр моего textView, когда текст вставлен.
Спасибо за чтение.
Ваш UITextView вызовет его метод UITextViewDelegate
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
если делегат настроен. Это вызывается как при наведении символа на клавиатуре, так и при вставке текста в текстовое представление. Вложенный текст - это аргумент replaceText.
Вот что я использую для обнаружения событий вставки в UITextView:
// Set this class to be the delegate of the UITextView. Now when a user will paste a text in that textview, this delegate will be called.
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
// Here we check if the replacement text is equal to the string we are currently holding in the paste board
if ([text isEqualToString:[UIPasteboard generalPasteboard].string]) {
// code to execute in case user is using paste
} else {
// code to execute other wise
}
return YES;
}
Проверка картонной строки на if string == UIPasteboard.general.string
занимает пару секунд, если у вас длинное предложение в картотеке. Пользователь видит, что клавиатура заблокирована во время этой проверки.
Мое решение состоит в том, чтобы проверить, больше ли длина новых символов больше 1.
Если длина больше 1, строка выводится из картона.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.characters.count > 1{
//User did copy & paste
}else{
//User did input by keypad
}
return true
}
Это рабочий Perfect Xcode 9.4 Swift 4.1
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text.contains(UIPasteboard.general.string ?? "") {
return false
}
return true
}
Когда пользователь пытается вставить в текстовое поле, условие if будет выполнено
Этот код перестанет вставлять
carlos16196 был хорошим подходом, но я бы также подстроил его, изменив [text isEqualToString:[UIPasteboard generalPasteboard].string]
на [text containsString:[UIPasteboard generalPasteboard].string]
Таким образом вы обнаружите, когда пользователь вставляет текст в текстовое поле после другого напечатанного текста, который не находится в UIP файле.
Это код:
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
// Here we check if the replacement text is equal to the string we are currently holding in the paste board
if ([text containsString:[UIPasteboard generalPasteboard].string]) {
// code to execute in case user is using paste
} else {
// code to execute other wise
}
return YES;
}
попробуйте подклассы UITextview и переопределите эту функцию.
public override func paste(_ sender: Any?)
Вот что я использую для обнаружения вставленных изображений:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (UIPasteboard.generalPasteboard.image &&
[UIPasteboard.generalPasteboard.string.lowercaseString isEqualToString:text.lowercaseString]) {
//Pasted image
return NO;
}
return YES;
}
В SWIFT 4:
func textViewDidChange(_ textView: UITextView) {
if(textView.text == UIPasteboard.general.string)
{
//Text pasted
}
}