UITapGestureRecognizer и автокоррекция - PullRequest
3 голосов
/ 28 июля 2011

У меня есть следующий код:

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                    action:@selector(dismissKeyboard)];
    [self.view addGestureRecognizer:tap];
    tap.cancelsTouchesInView = NO;
    tap.delegate = self;
    [tap release];
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
}

У textField есть clearButton, и автокоррекция включена. Когда я нажимаю на кнопку clearButton, все работает нормально, и клавиатура все еще появляется после очистки UITextField. Однако, когда я не хочу принять предложенное автоматическое исправление, клавиатура исчезает, и мой текст заменяется предлагаемым.

Мне нужен UITapGestureRecognizer, потому что у меня есть UITextField внутри UITableView, поэтому, когда пользователь нажимает за пределами UITextField, я хочу отложить клавиатуру.

Как это исправить, чтобы можно было отказаться от автокоррекции, когда пользователь захочет, а клавиатура все еще активна? Почему это работает правильно с clearButton, но не при отклонении автокоррекции?

РЕДАКТИРОВАТЬ: Он работает правильно с clearButton, потому что он находится внутри UITextField. Таким образом, жест не запущен. Но при нажатии на предлагаемое исправление текста оно срабатывает ... Есть ли способ проверить, нажал ли пользователь на предложенное исправление текста?

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Вот метод делегата жестов, который я реализовал, чтобы решить проблему при нажатии синего автокорректированного текста:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    BOOL handleTouch = NO;
    UIView *v = [self.view hitTest:p withEvent:nil];
    Class autocorrectionCancelClass = NSClassFromString(@"UIAutocorrectInlinePrompt");
    if( ![v isKindOfClass:UIControl.class] && ![v isKindOfClass:autocorrectionCancelClass]  && ![v isDescendantOfView:currentlyEditedTextView] )
    {
        handleTouch = YES;
    }

    return handleTouch;
}

При нажатии кнопки отмены автокоррекции v - это представление частного класса SDK UIAutocorrectInlinePrompt, но это также подпредставление отредактированного UITextField / UITtextView.

Редактировать: проверка класса лучше, поскольку для UITextField представление UIAutocorrectInlinePrompt не является потомком поля (протестировано на iOS 4.3 и 5.0). Проблема в том, что этот класс можно переименовать, поскольку он является частным.

0 голосов
/ 06 января 2013

решение кендзи работает хорошо, за исключением исключения UIControl-s.Вот более чистая и простая версия его решения:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ![touch.view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")];
}
...