Странное поведение при горизонтальной прокрутке UITableView (в Monotouch)

У нас есть UITableView, который мы настроили так, чтобы он действовал как сетка, допуская как горизонтальную, так и вертикальную прокрутку. Мы достигаем этого, динамически изменяя ContentSize в пользовательском методе LayoutSubviews UITableView, который помогает с автоповоротом, прокруткой и т. д.

Все работает, как и ожидалось, за исключением пары наших больших сеток. Когда эти сетки прокручиваются по горизонтали (проведите пальцем влево), как только ContentOffset.X становится больше или равен Bounds.Width, табличное представление исчезает. Он по-прежнему присутствует и получает ввод, но ничего не рисуется. При свайпе назад вправо, как только порог ширины пересекается, все перерисовывается.

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

Я проверил и/или удалил максимально возможное количество нашего пользовательского кода рисования, но проблема все еще возникает. У кого-нибудь есть идеи?


person competent_tech    schedule 07.11.2011    source источник
comment
В чем преимущество злоупотребления UITableView по сравнению с UIScrollView и реализации реального решения с несколькими столбцами для ваших нужд?   -  person Krumelur    schedule 09.11.2011
comment
Преимущество использования UITableView в первую очередь заключается в повторном использовании ячеек. Наши пользователи могут иметь тысячи записей в заданном списке с 5-20 столбцами. Если бы мы реализовали представления прокрутки, нам пришлось бы изменить размер представлений таблиц до их полного размера, чтобы представление прокрутки прокручивалось правильно, и, таким образом, пришлось бы создавать каждую отдельную ячейку.   -  person competent_tech    schedule 09.11.2011
comment
Если я вернусь к программированию игр, которым я занимался в конце 90-х, то каждый бит, когда мы прокручивали вниз, создавали следующие ряды экранов на скрытом верху. Если была прокручена одна высота экрана, смещение прокрутки сбрасывалось, и следующий экран уже был заполнен. Это также работает при прокрутке вверх и вниз. Я думаю, что здесь применима та же техника. Но это действительно больше работы, чем использование UITableView.   -  person Krumelur    schedule 09.11.2011


Ответы (2)


Это связано с тем, что, хотя UITableView наследуется от UIScrollView, он предназначен только для одного столбца, поэтому он рисует свои ячейки в соответствии со своими границами.

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

person Dimitris Tavlikos    schedule 07.11.2011
comment
Поскольку UITableView наследуется от UIScrollView, добавление SubView в UITableView, а затем установка ContentSize UITableView обеспечивает точно такое же решение, как вы предложили, с дополнительным преимуществом повторного использования собственных ячеек UITableView, что имеет решающее значение в больших списках. - person competent_tech; 07.11.2011
comment
Какие подпредставления вы хотите добавить в UITableView? Другие представления таблицы? - person Dimitris Tavlikos; 07.11.2011
comment
Поскольку мы эмулируем сетку, каждое подпредставление логически представляет собой столбец данных, а программно — UILabel. - person competent_tech; 07.11.2011

Я столкнулся с той же проблемой и опубликовал отчет об ошибке (10561166) еще в декабре на сайте Apple Developer.

Сегодня я получил ответ от Apple, в котором они заявили, что

UITableView не предназначен для горизонтальной прокрутки.

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

person Scott Roberts    schedule 25.04.2012