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 за указание верного пути.

Другие вопросы по тегам