テキストのブロックがUITextViewに貼り付けられると、どのイベントが発生しますか?テキストを貼り付けるときに、textViewのフレームを変更する必要があります。
読んでくれてありがとう。
UITextViewはそのUITextViewDelegateメソッドを呼び出します
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
代理人が設定されている場合。これは、キーボードで文字が入力されたときと、テキストがテキストビューに貼り付けられたときの両方で呼び出されます。貼り付けられるテキストはreplacementText引数です。
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
}
この動作するパーフェクト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]
に変更して微調整することもできます。
これを行うことにより、ユーザーがUIPasteboardにない他の入力されたテキストの後にテキストビューに貼り付けたときを検出します。
これはコードです:
-(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;
}
Swift5.1用です
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if let paste = UIPasteboard.general.string, text == paste {
print("paste")
} else {
print("normal typing")
}
return true
}