Как избежать события отмены касаний?

#ios #cocoa-touch #uitouch #touchescancelled

#iOS #cocoa-touch #uitouch #касание отменено

Вопрос:

У меня есть два представления, одно под другим. Я поворачиваю вид ниже, используя сенсорное управление видом сверху. при попытке выполнить свайп событие отмены касаний вызывается перед событием завершения касаний. При перемещении пальца вызываются события «касания начались» и «касания перемещены», а затем событие «касания завершены» вызывается последним (в основном). Но иногда при попытке двигаться медленно событие отмены касаний вызывается остановкой событий касания. Поэтому я не мог поворачивать просмотр на низкой скорости. В чем может быть проблема? как избежать события отмены касаний?

Примечание: Я рисую некоторые графики в представлениях, используя библиотеку core-plot.

Ответ №1:

Если вы используете какие-либо UIGestureRecognizers приложения, они автоматически отменяют касания к другим представлениям, когда распознают их жест. Вы можете отключить это поведение с помощью cancelsTouchesInView свойства распознавателя.

Ответ №2:

Если вы не используете UIGestureReconizer напрямую, имейте в виду свойство gestureRecognizers пользовательского интерфейса. У меня такая же проблема, и с помощью этого кода я ее решаю:

 if (event.type == UIEventTypeTouches)
{
    NSSet* tmpTouches = [event  touchesForView:m_PhotoView];
    if ([tmpTouches count] == 2)
    {
        UITouch *tmpTouch1 = [[tmpTouches allObjects] objectAtIndex:0];
        UITouch *tmpTouch2 = [[tmpTouches allObjects] objectAtIndex:1];
        if ((tmpTouch1 != nil)amp;amp;(tmpTouch2 != nil))
        {
            UIGestureRecognizer * tmpG;
            if ([tmpTouch1.gestureRecognizers count] > 0)
            {
                tmpG = [tmpTouch1.gestureRecognizers objectAtIndex:0];
                tmpG.cancelsTouchesInView = NO;
            }
            if ([tmpTouch2.gestureRecognizers count] > 0)
            {
                tmpG = [tmpTouch2.gestureRecognizers objectAtIndex:0];
                tmpG.cancelsTouchesInView = NO;
            }
            // Code ...
        }
    }
}
  

Комментарии:

1. Это было идеально для того, что мне было нужно, поскольку я не использовал gestureRecognizers, и это отключило все события отмены от разрушения моих плавных движений. Спасибо pocjoc.

2. Я не использую жесты, но я не понимаю значения того, что tmpTouches считаются равными 2 и жестко кодируют значения индексов. Не могли бы вы, пожалуйста, объяснить немного больше об этом?

Ответ №3:

Также обратите внимание на UISwipeGestureRecognizer. Это вызывало проблему для меня и решается, как только мы устанавливаем

 [recognizer setCancelsTouchesInView:FALSE];
  

Ответ №4:

Если задействован вид прокрутки, снимите флажок с его свойства content касание может отменяться при прокрутке в storybord.