web-dev-qa-db-ja.com

textViewのタッチをブロックせずにUITapGestureRecognizerをUITextViewに追加します

UITextViewにUITapGestureRecognizerを追加しても、normalとしてUITextViewにアクセスするにはどうすればよいですか?

現在、textViewにカスタムジェスチャを追加するとすぐに、カーソルの配置などのUITextViewのデフォルトアクションのタップがブロックされます。

var tapTerm:UITapGestureRecognizer = UITapGestureRecognizer()

override func viewDidLoad() {
    tapTerm = UITapGestureRecognizer(target: self, action: "tapTextView:")
    textView.addGestureRecognizer(tapTerm)
}

func tapTextView(sender:UITapGestureRecognizer) {
    println("tapped term – but blocking the tap for textView :-/")
…
}

タップを処理しながら、カーソル位置などのtextViewの動作をそのまま維持するにはどうすればよいですか?

12
Bernd

これを行うには、View ControllerにUIGestureRecognizerDelegateを採用させ、オーバーライドは次のようなジェスチャ認識メソッドと同時に認識される必要があります。

override func viewDidLoad() {
    tapTerm = UITapGestureRecognizer(target: self, action: "tapTextView:")
    tapTerm.delegate = self
    textView.addGestureRecognizer(tapTerm)
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {

    return true
}
26
Zell B.

誰かがObjectiveCで@ZellB。の答えを探してここに来た場合、コードは次のとおりです。

- (void)viewDidLoad {
    [super viewDidLoad];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(textViewTapped:)];
    tap.delegate = self; 
    tap.numberOfTapsRequired = 1; 
   [self.textView addGestureRecognizer:tap];
}   

- (void)textViewTapped:(UITapGestureRecognizer *)tap {
    //DO SOMTHING 
}

#pragma mark - Gesture recognizer delegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES; 
}

PS:<UIGestureRecognizerDelegate>を忘れないでください

3
Anish Kumar

Swift 4.2
次の手順では、UITextViewのコンテンツをスクロールしながら、タップするだけでフルスクリーンのUITextViewをエスケープできます。

  1. UIGestureRecognizerをUITableViewから切断しました。
  2. CustomTextViewを作成しました:UITextView。
  3. CustomTextViewを使用して特定のUIViewControllerに「sender」変数を追加しました。
  4. 「タッチが終了しました...」のトラップ
  5. 送信側UIViewController内でexcape関数を呼び出します。
class CustomTextView: UITextView {
    var sender: DocViewController?

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let controller = sender {
            controller.handleSwipeGesture()
        }
    }
}

UITextViewのコンテンツをスクロールするか、単にタップして終了することができます。
「送信者」は、作成時にホスティングUIViewControllerから設定されます。

0