UITableView с пользовательским пейджинговым поведением
Я пытаюсь реализовать подкачку страниц нестандартного размера в UITableView. Я пытаюсь добиться того, чтобы верх активной ячейки был выровнен с верхом tableView, при этом все еще показывая верх следующей ячейки в нижней части tableView (чтобы склонить пользователя к прокрутке и просмотру большего количества ячеек).,
Все мои клетки одинаковой высоты.
Если я установлю paging=YES
это приводит к небольшому смещению, которое увеличивается, когда я пролистываю страницы. Это связано с тем, что мой tableView немного выше, чем одна ячейка, а высота ячейки / размер страницы не совпадают.
Я пробовал разные вещи с включенным пейджингом. Я попытался установить размер tableView на высоту ячейки, но затем отключил обрезку и маскировку, чтобы пользователь все еще мог видеть следующую ячейку. Это не работает, поскольку следующая ячейка добавляется только к базовому scrollView в самые последние мс перед тем, как ячейка прокручивается в ограничивающую рамку tableView.
Затем я начал реализовывать различные методы делегата scrollView, чтобы имитировать поведение подкачки - я не могу понять, что это правильно.
Я, между прочим, попробовал что-то вроде этого:
- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
float cellHeight = [myCell rowHeight];
int index = floorf(scrollView.contentOffset.y / cellHeight);
*targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight));
}
В то время как это делает правильные вещи, оно ведет себя не так, как scrollView / tableView с включенной подкачкой страниц.
Я нашел здесь несколько сообщений от людей, пытающихся достичь того же, но ответы страдают от того же "не родного ощущения", что и все, что я пробовал сам.
Спасибо за любую помощь.
iOS> = 5.0
3 ответа
Воплощать в жизнь scrollViewWillEndDragging:withVelocity:targetContentOffset:
вернуть верхнюю координату ячейки, ближайшей к targetContentOffset
не ближе к вашему начальному смещению. Решение, предоставленное jjv360, хорошо справляется с этой задачей, но вы можете настроить его в зависимости от того, насколько высоки ваши ячейки в среднем (решение jjv360 может быть слишком быстрым на действительно больших ячейках).
Я просто хотел бы добавить, что вы можете сделать UITableView
торможение быстрее вести себя как постраничный UIScrollView
изменив его decelerationRate
свойство (просто сделайте это один раз в init/viewDidLoad/ где угодно).
self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
Если вы отключите пейджинг, вы можете использовать UIScrollView
функция делегата:
-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset {
// Get index path for target row
NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)];
// Set new target
(*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin;
}
Я решил эту проблему с этим кодом:
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */;
_currentPage = floor((self.collectionView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
NSLog(@"Dragging - You are now on page %i", _currentPage);
}
-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset {
CGFloat pageWidth = self.collectionView.frame.size.width + 10;
int newPage = _currentPage;
if (velocity.x == 0) // slow dragging not lifting finger
{
newPage = floor((targetContentOffset->x - pageWidth / 2) / pageWidth) + 1;
}
else
{
newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1;
if (newPage < 0)
newPage = 0;
if (newPage > self.collectionView.contentSize.width / pageWidth)
newPage = ceil(self.collectionView.contentSize.width / pageWidth) - 1.0;
}
NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage);
*targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y);
}
Спасибо http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html за указание верного пути.