Перенаправить касание события двумя пальцами на UITextView

Мне нужно применить функцию, когда пользователь касается экрана двумя пальцами. Моя проблема в том, что на экране есть UITextView.

На экране также присутствует активная клавиатура, поэтому обычный подход (UITapGestureRecognizer) не работает для этой конфигурации.

Как я могу это сделать?

Спасибо.


person benhi    schedule 19.02.2012    source источник
comment
Так вы пытаетесь заставить UITextView реагировать на прикосновения?   -  person    schedule 19.02.2012
comment
Проверьте мой ответ. Возможно, это вам поможет.   -  person    schedule 19.02.2012


Ответы (3)


Поскольку вы не можете создать подкласс UIKeyboard для передачи касаний, возможно, эта ссылка вам поможет.

Определить, касался ли пользователь экрана

Есть подкласс UIWindow - если вы установите его в качестве главного окна приложения (в appDelegate), вы можете улавливать прикосновения до того, как они попадут на клавиатуру. Там вы сможете проверить, находятся ли касания в области UITextField (и правильно их обработать), или отправить их в цепочку респондентов.

Не так элегантно, как распознавание жестов, но вы можете заставить его работать.

person Rok Jarc    schedule 21.02.2012

Вам нужно добавить UITapGestureRecognizer в UITextView.

Вот что вы должны сделать:

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(respondToTap)];

[singleTap setNumberOfTapsRequired:2];
[self.yourTextView addGestureRecognizer:tapRecognizer];


-(void)respondToTap{
//do whatever you have to when textfield is double tapped
}
person Community    schedule 19.02.2012
comment
Спасибо за ответ, но он не работает, я уже пробовал этот метод. Проблема в том, что я думаю, что UITapGestureRecognizer не поддерживается UITextView. - person benhi; 19.02.2012
comment
Но это было только с одним касанием, поэтому с более чем одним он может не работать. Извините за путаницу. - person ; 19.02.2012
comment
Хорошо, я понял проблему, когда клавиатура поднята и курсор доступен, с помощью этого метода мы не можем заставить UITextView реагировать на прикосновения даже на одно нажатие. А в моем случае клавиатура и курсор доступны всегда. Поэтому мне нужно найти решение для этой конфигурации. Может ты другой способ знаешь ?? Спасибо. - person benhi; 20.02.2012
comment
Попробуйте сделать UITextView недоступным для редактирования. Может быть, это поможет, но, вероятно, нет. - person ; 20.02.2012

Подобно этому ответу, который я дал на аналогичный вопрос, но с оговоркой, что я использовал это только на iOS 10, вы можете сделать это, расширив UITextView пользовательским классом и переопределив addGestureRecognizer:.

Отслеживание singleTap просто действует как дозорный для добавления касания двумя пальцами, поскольку UITextView постоянно добавляет и удаляет жесты:

@interface MyCustomTextView ()

@property (weak, nonatomic) UITapGestureRecognizer *singleTap;

@end


@implementation MyCustomTextView

/**
 *  this will fire when the text view is tapped with two fingers
 *
 *  @param tgr
 */
- (void)_handleTwoTouches:(UITapGestureRecognizer *)tgr
{
    // ADD CODE HERE
}

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    [super addGestureRecognizer:gestureRecognizer];
    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer;
        if ([tgr numberOfTapsRequired] == 1 && [tgr numberOfTouchesRequired] == 1) {

            if (!self.singleTap) {
                self.singleTap = tgr;

                UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTwoTouches:)];
                tap.numberOfTapsRequired = 1;
                tap.numberOfTouchesRequired = 2;
                [super addGestureRecognizer:tap];

            }

        }
    }
}

@end
person Jaymon    schedule 04.10.2016