Вложенные UITableView: способ прокрутки одновременно внешнего вертикального UITableView и дочернего горизонтального UITableView? - PullRequest
4 голосов
/ 12 апреля 2011

Когда вы работаете с нетипичными вложенными настройками UITableView - где у вас есть внешний вертикальный UITableView, который содержит повернутые на 90 ° UITableViews (см .: Поиск библиотеки пользовательского интерфейса для горизонтального представления данных в iOS ):Есть ли способ заставить iOS обрабатывать вертикальные и горизонтальные касания одновременно ?

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

Только я хотел бы иметь возможность двигать пальцем по диагонали и одновременно видеть внешний UITableView и внутреннюю прокрутку UITableView.

Я попробовал несколько подходов (играя с canCancelContentTouches, delaysContentTouches и сенсорными сообщениями), но я не нашел способа сделать это.

РЕДАКТИРОВАТЬ: Вот проект XCode4, который показывает этоПоведение: http://marcanton.io/other/stackoverflow/nestedtableviews.zip

РЕДАКТИРОВАТЬ: Я отправил эту проблему в службу технической поддержки Apple для разработчиков, вот их ответ:

Спасибо, что написали в службу технической поддержки Apple Worldwide Developer.Я отвечаю на ваш запрос относительно событий касания во встроенных UITableViews.

Обычно такой подход не рекомендуется.Проблема заключается в том, что UITableView наследуется от UIScrollView и, как указано в документации для UIScrollView:

"Важно: не следует встраивать объекты UIWebView или UITableView в объекты UIScrollView. В этом случае может возникнуть непредвиденное поведение, поскольку сенсорные событияибо два объекта могут быть смешаны и неправильно обработаны. "

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html%23//apple_ref/occ/cl/UIScrollView

Так что на этот раз нет обходного пути для одновременной прокрутки обоих.

Я рекомендую вам подать запрос на улучшение на http://developer.apple.com/bugreporter/ с подробным описанием того, что вы хотели бы, чтобы мы добавили в будущем выпуске.

Тем не менее, я думаю, что необходимобыть способ включить эту функцию, хотя я понимаю, что это не рекомендуется.Фактически, Apple даже не рекомендует размещать UITableViews внутри другого UITableView, но, за исключением сделанного выше, он работает довольно красиво.Я буду держать этот вопрос в курсе наших коллективных выводов.

РЕДАКТИРОВАТЬ: Есть на самом деле способ, подробно здесь: http://marcanton.io/blog/nested-orthogonal-tableviews/

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

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

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

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

1 голос
/ 12 апреля 2011

Интересно, что я еще не играл с подобными настройками, но я бы попытался перехватить события касания во вложенных UITableViews и делегировать любое вертикальное движение внешнему UITableView - и наоборот.

...