UTTableView
является подклассом UIScrollView
, поэтому вы можете использовать метод scrollViewDidScroll
для изменения позиции прокрутки TableView после прокрутки.
Вы можете использовать tableView.contentOffset
, чтобы узнать, где находится ваша текущая позиция прокрутки. И, разделив его на осмысленное число, вы можете определить, какая ячейка находится сверху.
int cellIndex = tableView.contentOffset / cellHegiht;
Или вы можете получить видимую ячейку в центре (вверху, внизу) следующим образом:
NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];
NSIndexPath *selectedIndexPath = [indexPathsForVisibleRows objectAtIndex:(indexPathsForVisibleRows.count / 2)]; //this gets center cell
После расчета, какая ячейка должна щелкнуть по ее краю сверху (или снизу), вы можете исправить отклонение от края ячейки, вызвав:
[tableView scrollToRowAtIndexPath:selectedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Вы можете использовать UIScrollViewDelegate
методы для активации привязки. Вы можете активировать либо когда анимация прокрутки завершена, либо пока анимация продолжается. Это приведет к другому взаимодействию с пользователем и не скажет, что одно лучше другого.
Но реализация следующего метода и ничего более не похожа на мою любимую:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset {
int cellHeight = 41;
*targetContentOffset = CGPointMake(targetContentOffset->x,
targetContentOffset->y - (((int)targetContentOffset->y) % cellHeight));
}
Этот метод вызывается, когда пользователь касается TableView
, чтобы уведомить приложение. targetContentOffset
- это переменная inout
, поэтому вы можете установить конечную позицию прокрутки, пока анимация продолжается. Используя право cellHeight
, ваш TableView
всегда будет привязываться к ячейкам.