UITapGestureRecognizer беда местоположение крана - PullRequest
1 голос
/ 13 сентября 2011

У меня есть вид UITextField и кнопка «Отправить».Когда пользователь нажимает на поле UITextField, появляется клавиатура.Я перемещаю представление вверх, чтобы полезные биты не блокировались клавиатурой, а когда клавиатура исчезает, я снова переключаю содержимое вниз (зарегистрировано для отображения / скрытия клавиатуры).

Я хочу, чтобы пользователи моглинажать в любом месте в представлении, чтобы угробить клавиатуру.Поэтому я добавил UITapGestureRecognizer и вызываю resignFirstResponder для моего текстового поля.Прекрасно работает ... в основном.

Если вы нажмете кнопку "Отправить", она не будет работать.Это не отменяет TouchInView, я установил это на НЕТ.Это движущийся вид.«Касание» регистрируется в режиме пост-сдвига вниз.Поэтому, когда я сдвигаю вид вниз на 80 пунктов, нажатие, сделанное пользователем «на кнопке», оказывается на 80 пунктов выше кнопки.

Итак, как мне пройти этот сигнал до запуска события Gesture Recognizer ивызывает смещение вида?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Я нашел исправление, которое лучше всего подходит для меня.

UIGestureRecognizerDelegate имеет метод – gestureRecognizer:shouldReceiveTouch:, который позволяет вам выбрать, следует ли распознавать жест распознавателю жестов.

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isKindOfClass:[UIControl class]])
            return NO;
        return YES;
    }

По сути, если касание произошло с чем-либо, что является подклассом объекта UIControl, пусть этот объект обрабатывает щелчок, в противном случае мой распознаватель жестов получает его.

1 голос
/ 13 сентября 2011

Я использую ту же функциональность во многих моих приложениях. Вместо того чтобы использовать GestureRecognizer, я настроил свой вид как UIControl, а не UIView. Вы по-прежнему можете делать то же, что и с UIView, но вы также можете назначить IBActions, которые будут выполняться при взаимодействии с представлением.

Вот как это сделать: в Interface Builder выберите свой вид. Затем назначьте его класс UIControl. (Вероятно, в настоящее время он установлен как UIView.)

В вашем ViewController для этого представления напишите метод IBAction для обнаружения backgroundTaps. Моя выглядит так:

- (IBAction)backgroundTap:(id)sender
{
    if ([textField1 isEditing]) {
        [textField1 resignFirstResponder];
    } else if ([textField2 isEditing]) {
        [textField2 resignFirstResponder];
    }
}

Наконец, в Интерфейсном Разработчике подключите созданный вами IBAction к UIControl.

1 голос
/ 13 сентября 2011

Если вы хотите, чтобы представление действовало как кнопка, используйте UIControl, оно действует как события UIButton и является подклассом UIView, так что вы можете добавить событие touchUpInside, когда пользователь нажимает на представление и отклоняет клавиатуру, а также закрывать клавиатуру, когдапользователь нажимает кнопку отправки, и это должно сработать.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...