Как украсть штрихи от UIScrollView?

Сегодня, в мое творческое время, я провел довольно подробное исследование того, как украсть штрихи от UIScrollView и сразу отправить их на конкретный подвью, сохраняя при этом поведение по умолчанию для остальной части прокрутки. Рассмотрите возможность использования UIPickerView внутри UITableView. Поведение по умолчанию состоит в том, что если вы перетащите свой палец над видом подборщика, прокрутка будет прокручиваться, и представление выбора останется неизменным.

Первое, что я пробовал, – это переопределить

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 

и просто не позволяйте UIScrollView отменить касания внутри представления выбора. Это работает, но имеет неприятный побочный эффект. Вы хотели бы, чтобы представление выбора сразу отвечало, и вам придется установить delaysContentTouches в НЕТ. Проблема в том, что вы не хотите, чтобы остальная часть представления таблицы сразу отвечала, потому что, если ячейка представления таблицы всегда будет подсвечиваться на несколько миллисекунд до начала прокрутки.

Во-вторых, я пытался переопределить

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 

потому что я прочитал, что просмотр прокрутки всегда возвращает себя, так что он «украдет» штрихи из своих подзонов, а затем отправит их в subview, если они не представляют интерес для просмотра прокрутки. Однако это не так. UIScrollView по умолчанию для реализации hitTest: withEvent: фактически возвращает subview, который должен получить прикосновение. Вместо этого он использует распознаватели жестов, чтобы перехватить штрихи.

Итак, третья вещь, которую я попытался, заключалась в том, чтобы реализовать свой собственный распознаватель жестов и заставить его потерпеть неудачу, если прикосновение было вне представления выбора и в противном случае это получилось. Затем я установил все распознаватели жестов в режиме прокрутки, если мой распознаватель жестов не выполнил следующий код:

 for (UIGestureRecognizer * gestureRecognizer in self.tableView.gestureRecognizers) { [gestureRecognizer requireGestureRecognizerToFail:myRecognizer]; } 

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

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) [touch.view touchesBegan:touches withEvent:event]; } 

Вышеприведенный код является упрощенной версией. Я также убеждаюсь, что представление представляет собой представление выбора (или одно из его подзонов) и устанавливает соответствующее состояние для распознавателя жестов, как я упоминал выше. Я также сделал то же самое для отмены, закончил и переехал. Тем не менее, выборщик все еще не ответил.

Я также попробовал еще одну вещь, прежде чем вернуться к своей обычной работе. Во время моего обширного поиска я читал, что вложенные UIScrollViews просто магически сработали с 3.x, поэтому я попытался поместить мой выборщик внутри вложенного UIScrollView и установить для него следующие свойства:

 scrollView.delaysContentTouches = NO; scrollView.canCancelContentTouches = NO; 

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

Я знаю, что UIScrollView имеет распознаватель жестов с именем UIScrollViewDelayedTouchesBeganGestureRecognizer который перехватывает штрихи и отправляет их в соответствующее подвью после 150 (?) Мс. Я думаю, что я должен был бы написать аналогичный распознаватель, который заставит распознавания по умолчанию прокрутки игнорировать, и вместо того, чтобы откладывать касания, он сразу же отправляет их в представление выбора. Поэтому, если кто-нибудь знает, как написать такой распознаватель, пожалуйста, дайте мне знать, и если у вас есть какое-либо другое решение проблемы, вы тоже очень приветствуете его.

Благодарим вас за то, что вы прочитали весь вопрос, и даже если вы не знаете ответа, вы все равно можете поставить вопрос, чтобы он уделял больше внимания (надеюсь, от кого-то, кто может ответить на него). Благодаря! 🙂

    Иногда вам нужно задать вопрос, прежде чем вы сможете найти ответ. У Дэн Рэй была аналогичная проблема, и он решил это с помощью совершенно другого решения.

     - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView* result = [super hitTest:point withEvent:event]; if ([result.superview isKindOfClass:[UIPickerView class]]) { self.scrollEnabled = NO; } else { self.scrollEnabled = YES; } return result; } 

    Я тестировал код, и он отлично подходит для меня. Однако на самом деле это не ворует прикосновения к просмотру прокрутки, поэтому, если кто-нибудь знает, как на самом деле украсть штрихи, это было бы здорово.

    Источник: UIPickerView внутри UITableView.tableFooterView не получает перетаскивания

    Немного поздно, но я нашел это решение: http://www.cocoanetics.com/2010/06/hacking-uiscrollview-gesture-recognizers/ Работает для меня

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

     let panGesture = UIPanGestureRecognizer() panGesture.cancelsTouchesInView = false myView?.addGestureRecognizer(panGesture) 
    Давайте будем гением компьютера.