web-dev-qa-db-ja.com

(iPhone)UITextViewのタッチを処理する方法は?

IPhoneのUITextViewのタッチを処理しようとしています。たとえば、UIImageViewsのサブクラスを作成し、touchesBeganメソッドを実装することで、タップやその他のタッチイベントを正常に処理できました...ただし、UITextViewでは機能しないようです:(

UITextViewでは、ユーザーとの対話とマルチタッチが有効になっています。念のために言っておきますが...喜びはありません。誰かがこれを処理することができましたか?

24
devguy

UITextView(UIScrollViewのサブクラス)には、多くのイベント処理が含まれています。コピーアンドペーストとデータ検出器を処理します。とはいえ、未処理のイベントが渡されないのはおそらくバグです。

簡単な解決策があります。UITextViewをサブクラス化し、独自のバージョンで独自のtouchesEnded(およびその他のイベント処理メッセージ)を実装できます。call[super touchesBegan:touches withEvent:event];すべてのタッチ処理方法の内部。

#import "MyTextView.h"  //MyTextView:UITextView
@implementation MyTextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
        [super touchesBegan:touches withEvent:event];
    NSLog(@"touchesMoved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"****touchesEnded");
    [self.nextResponder touchesEnded: touches withEvent:event]; 
    NSLog(@"****touchesEnded");
    [super touchesEnded:touches withEvent:event];
    NSLog(@"****touchesEnded");
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
[super touches... etc]; 
NSLog(@"touchesCancelled");
}
14

UITextViewでシングル/ダブル/トリプルタップを処理する場合は、UIGestureRecongnizerを委任して、テキストビューにジェスチャ認識機能を追加できます。

ここに同じコードがあります(viewDidLoad内):

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)];

//modify this number to recognizer number of tap
[singleTap setNumberOfTapsRequired:1];
[self.textView addGestureRecognizer:singleTap];
[singleTap release];

そして

-(void)handleSingleTap{
   //handle tap in here 
   NSLog(@"Single tap on view");
}

この助けを願っています:D

11
REALFREE

UITextView instance.delegate = selfを割り当てる必要があります(同じコントローラーでイベントを処理する場合)

そして、インターフェースにUITextViewDelegateプロトコルを実装するようにしてください...例:

@interface myController : UIViewController <UITextViewDelegate>{
}

次に、次のいずれかを実装できます


- (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
- (BOOL)textViewShouldEndEditing:(UITextView *)textView;

- (void)textViewDidBeginEditing:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (void)textViewDidChange:(UITextView *)textView;

- (void)textViewDidChangeSelection:(UITextView *)textView;

2
dizy

大きなビューのサブビューとしてテキストビューを使用しています。ユーザーがテキストビューをスクロールできるようにする必要がありますが、編集することはできません。テキストビュー自体を含め、テキストビューのスーパービューのシングルタップを検出したいと思います。

もちろん、私はテキストビューがそれから始まるタッチを飲み込むという問題に遭遇しました。ユーザーインタラクションを無効にするとこれは修正されますが、ユーザーはテキストビューをスクロールできなくなります。

私の解決策は、テキストビューを編集可能にし、テキストビューのshouldBeginEditingデリゲートメソッドを使用して、テキストビューのタップを検出することでした。 NOを返すだけで編集できなくなりますが、テキストビュー(したがってスーパービュー)がタップされていることがわかりました。このメソッドとスーパービューのtouchesEndedメソッドの間に必要なものがあります。

実際のタッチにアクセスしたい人にはこれが機能しないことは知っていますが、タップを検出するだけであれば、このアプローチは機能します!

1
CharlieMezak

Touch Downイベントを送信することもできます。 InterfaceBuilderを介してこのイベントを接続します。

enter image description here

次に、イベントハンドラーにコードを追加します

- (IBAction)onAppIDTap:(id)sender {
    //Your code
}
0
Antony Thomas

テキストビューのスクロールを可能にするUIScrollViewと[scrollView addSubview: textview]を作成してみませんか?

0
wagashi