как заставить iOS 7 UIScrollView подавлять сенсорные события во встроенном UIView

Подумайте о UIScrollView со встроенными (подпредставлениями) UIView, расположенными в столбце. В iOS6 и более ранних версиях представление прокрутки можно было настроить таким образом, чтобы, когда вы щелкаете по нему пальцем, встроенные представления не получали события касания, даже если начальное касание было на одном из подпредставлений; но если вы коснетесь подпредставления без пролистывания, представление прокрутки решит, что это не действие прокрутки, и перенаправит события касания во встроенные представления. Это было очень удобно, если вы хотели иметь возможность перетаскивать встроенные UIView в файл UIScrollView.

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

Похоже, что модель этого поведения была изменена, так как iOS 5/6 подавляли сенсорные события, решая, является ли это действием прокрутки. Теперь доступны некоторые новые методы для отмены событий приземления после того, как UIScrollView решит, что он прокручивается. Но, очевидно, это бесполезно, если код перетаскивания также начал перемещать подпредставление.

Мой вопрос: есть ли способ запретить iOS 7 UIScrollViews вызывать низкоуровневые события касания в своих подвидах, когда вы инициируете действие прокрутки, поглаживая подвид? Когда я говорю «низкоуровневый», я имею в виду фактические события касания, а не использование распознавателей жестов. Я убежден, что просто установить для свойства delaysContentTouches значение YES не получится.

Эта проблема полностью сломала довольно сложный код, который гладко и красиво работал в iOS 5 и 6; и до сих пор я не обнаружил способа сообщить UIScrollView о подавлении событий в его подпредставлениях, пока он не определит, прокручивается он или нет. События проходят, затем позже запускается событие касания отмены, после того как вид прокрутки определяет, что он прокручивается. Похоже, что базовая модель была переопределена в худшую сторону, или это ошибка. Любая информация будет принята с благодарностью.


person user2856648    schedule 08.10.2013    source источник


Ответы (2)


Вы уверены, что это работало на iOS5/6? Основываясь на моем опыте и таких сообщениях, как UIScrollview delaysContentTouches issue, это не работает.

Возможно, пример кода, который показывает, что он работает на iOS5/6, но не на iOS7, поможет ответить на ваш вопрос.

person Szabi Tolnai    schedule 09.11.2013

Это работает для меня:

[scrollView setCanCancelContentTouches:YES];
[scrollView setDelaysContentTouches:YES];
person Ilya    schedule 02.05.2014