2

У меня очень странная проблема: кратковременная авария с UITextView при двойном нажатии, тогда как тот же код работает с версией iOS10 <. (Это означает, что ниже iOS10 версии нет аварии для пресс жест распознаватель)iOS10 UITextView сбой прикосновений к событию

На самом деле, я добавляю в двойное нажатие и нажмите Журнал жест на основе разрешения. Если у пользователя есть разрешение на комментарий, добавьте жесты в viewDidLoad методов. Комментарий допускается только с двойным краном или длинным нажатием

singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureAction:)]; 
singleTapGesture.numberOfTapsRequired = 1; 

// adding gesture to open window for commenting only when he has writing access 

if (canComment) { 

    longPressgesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureAction:)]; 
    longPressgesture.minimumPressDuration = 0.2; 
    doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap:)]; 
    doubleTap.numberOfTapsRequired = 2; 

} 

На одном кране

-(void)singleTapGestureAction:(UITapGestureRecognizer*)tapGestureRecognizer{ 

if (isSingleTapped) { 
    isSingleTapped = NO; 
    return; 
} 

isSingleTapped = YES; 

UITextView *textView = (UITextView *)tapGestureRecognizer.view; 

[self.commentView becomeFirstResponder]; // becomeFirstResponder 
} 

дважды нажмите

-(void)doDoubleTap:(UITapGestureRecognizer*)tapGestureRecognizer 
{ 
    UITextView *textView = (UITextView *)tapGestureRecognizer.view; 
    [self.commentView becomeFirstResponder]; // becomeFirstResponder 

    // To show the UIMenuController menu 
    [self setCommentMenuToolTipWithRect:completeRect]; 
} 

Примечание: Я добавляю [самоуправления .commentView становитсяFirstResponder]; на каждом жесте действия

методы UITextView делегат

- (void)textViewDidBeginEditing:(UITextView *)inView 
{ 

    [self.commentView becomeFirstResponder]; 
    range=[self.commentView selectedRange];  
} 

использования:

Когда я дважды нажмите, чтобы выбрать любое слово, затем APP CRASH и UIMenuController не появляется, enter image description here

но если я добавьте следующую строку приложение не врезаться

- (void)textViewDidChangeSelection:(UITextView *)textView{ 
    [textView resignFirstResponder]; 
} // app does not crash 

и UIMenuController появляется с пунктами меню комментарий, это замечательно. Я был счастлив, что исправил проблему с крушением.

Но есть еще одна проблема, когда я нажимаю на улице, кожевенное меню и выбрать любое слово ОПЯТЬ тогда Он не появляется во второй раз.


Я попробовал все возможные пути, чтобы показать меню для возвращения YES/TRUE, чтобы canBecomeFirstResponder. Я знаю, должен быть вид , который претендует на firstResponder для отображения меню. но как ?

На второй раз прикосновением, даже не вызывая какой-либо метод жест распознавателя

+0

Все детали под заголовком ** USE CASE: ** сбивают с толку. Является ли ваша проблема крахом или подсказкой? Пожалуйста, соответствующим образом обновите свой вопрос и удалите всю несущественную информацию. – lukya

+0

@lukya. Прежде всего, это сбой двойного нажатия на UITextView, но если я добавлю textViewDidChangeSelection, то он не сработает, но тогда всплывающая подсказка не появится –

+2

Это невозможно решить, просто глядя на ваш вопрос. Если возможно, укажите исходный код (через github и т. Д.). – lukya

ответ

1
longPressgesture.minimumPressDuration = 0.2; 

Моя догадка проблема здесь. 0.2s слишком мал, чтобы использоваться для longPress. Вероятно, оба были вызваны (longPress и двойной кран).

Измените его выше, чем 1,5 с.

2

Из журналов ясно, что при распознавании двойного крана одно и то же обновление касания также отправляется другому распознавателю жестов, что не срабатывает. Итак, простым решением было бы избежать обнаружения других жестов при двойном касании. Этого можно добиться просто, если все остальные жесты на commentView требуют, чтобы doubleTap потерпел неудачу, используя requireGestureRecognizerToFail. просто добавьте условие в метод addGestureToTextView, как показано ниже.

if (withDoubleTap && self.canScreenPlayEdit) { 
    [self.commentView removeGestureRecognizer:singleTapGesture]; 
    [self.commentView addGestureRecognizer:doubleTap]; 
    [self.commentView addGestureRecognizer:longPressgesture]; 

    for (UIGestureRecognizer *recognizer in self.commentView.gestureRecognizers) { 
     [recognizer requireGestureRecognizerToFail:doubleTap]; 
    } 
} 

Это действительно решает аварии, а также показывает меню без вызова resignFirstResponder в textViewDidChangeSelection.

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

+0

Спасибо за ваш ответ. Я следовал так же, как вы предлагали, авария не происходит, но меню не отображается во второй раз. Он показывает, когда вы долго нажимаете, но я хочу показать меню, когда пользователь дважды нажимает на любой текст. –

+0

Ну, у вас слишком много жестов, добавленных во слишком много мест. Мое предложение кода разрешает только описанный вами крах и открывает контекстное меню в первый раз. Для дальнейших вопросов вам нужно очень хорошо очистить свой код. – lukya

+0

спасибо. Но мой вопрос остается таким же. Как я уже упоминал в своем запросе «Но есть еще одна проблема, когда я нажимаю снаружи, меню скрывается и выбирает любое слово« СНОВА », а затем« ВТОРОЕ время ». –

Смежные вопросы