как реализовать циклическую прокрутку на табличном представлении - PullRequest
8 голосов
/ 15 апреля 2011

Не могли бы вы помочь мне с круговой прокруткой в ​​таблице, пожалуйста.

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

Как я могу это сделать.Любые предложения, пожалуйста.

Спасибо заранее.

Ответы [ 4 ]

3 голосов
/ 21 апреля 2011

Вы можете «подделать» циклическую прокрутку, повторяя одни и те же ячейки снова и снова. В методе numberOfRowsInSection верните n фактических чисел n раз. Убедитесь, что n достаточно велико.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return numberOfActualRows*100;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger actualRow = indexPath.row % numberOfActualRows;
    ...
}

Возможно, вы захотите скрыть индикатор прокрутки.

self.tableView.showsVerticalScrollIndicator = NO;

Вы также можете прокрутить представление таблицы до середины, прежде чем отобразить таблицу, чтобы прокрутка назад работала нормально.

[self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]/2 inSection:0]  atScrollPosition:UITableViewScrollPositionTop animated:NO];

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

2 голосов
/ 10 марта 2014

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

UITableView совпадает с UIScrollView в методе scrollViewDidScroll.

Итак, его легко эмулировать бесконечной прокруткой.

  1. удваивает массив так, чтобы голова и хвост соединялись, чтобы подражать круглому столу

  2. используйте мой следующий код, чтобы пользователь переключался между 1-й частью удвоенной таблицы и 2-й частью удвоенной таблицы, когда они стремятся достичь начала или конца таблицы.

/* To emulate infinite scrolling...

The table data was doubled to join the head and tail: (suppose table had 1,2,3,4)
1 2 3 4|1 2 3 4 (actual data doubled)
---------------
1 2 3 4 5 6 7 8 (visualising joined table in eight parts)

When the user scrolls backwards to 1/8th of the joined table, user is actually at the 1/4th of actual data, so we scroll instantly (we take user) to the 5/8th of the joined table where the cells are exactly the same.

Similarly, when user scrolls to 6/8th of the table, we will scroll back to 2/8th where the cells are same. (I'm using 6/8th when 7/8th sound more logical because 6/8th is good for small tables.)

In simple words, when user reaches 1/4th of the first half of table, we scroll to 1/4th of the second half, when he reaches 2/4th of the second half of table, we scroll to the 2/4 of first half. This is done simply by subtracting OR adding half the length of the new/joined table.

 Written and posted by Anup Kattel. Feel free to use this code. Please keep these comments if you don't mind.
*/


-(void)scrollViewDidScroll:(UIScrollView *)scrollView_ 
{  

    CGFloat currentOffsetX = scrollView_.contentOffset.x;
    CGFloat currentOffSetY = scrollView_.contentOffset.y;
    CGFloat contentHeight = scrollView_.contentSize.height;

    if (currentOffSetY < (contentHeight / 8.0)) {
    scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY + (contentHeight/2)));
    }
   if (currentOffSetY > ((contentHeight * 6)/ 8.0)) {
       scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY - (contentHeight/2)));
    }

}

P.S. - Я использовал этот код в одном из моих приложений под названием NT Time Table (Lite). Если вы хотите предварительный просмотр, вы можете проверить приложение: https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

Если ваша таблица иногда может быть слишком короткой, в начале описанного выше метода вы можете добавить логику if для выхода, когда подсчет данных, например, меньше 9.

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

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

Я бы сделалследующим образом:

  1. Создайте UITableView с произвольным числом ячеек (по крайней мере, 7, но потребуется больше, чтобы не допустить быстрой прокрутки в конце)
  2. Расположите свой UITableView так, чтобы он был в центревидимая ячейка
  3. Сохранение указателя на индекс ячейки, которую вы хотите отобразить
  4. В вашем cellForRowAtIndexPath: используйте указатель в качестве смещения и добавьте в него строку, чтобы получить ячейкучто вы хотите
  5. Когда UITableView перестал перемещаться (ваш UITableViewDelegate может служить UIScrollViewDelegate, поэтому вы можете использовать scrollViewDidEndDecelerating).Установите индекс смещения для текущей ячейки, переместите табличное представление обратно в центральную ячейку без анимации и перезагрузите данные.

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

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

С уважением

Dave

0 голосов
/ 21 апреля 2011

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

Вам необходимо использовать подобный прием, поскольку UITableView является подклассом UIScrollView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...