Размер страницы UITableView при включенной подкачке - PullRequest
13 голосов
/ 25 февраля 2010

Я столкнулся с простой, но утомительной проблемой. Я пытаюсь сделать UITableView на странице похожим на UIScrollView, но включение подкачки мне не очень помогает, потому что я не могу установить размер страницы, поэтому табличное представление точно прокручивает его высоту, чтобы отображались строки 1 ... 10 или 11 ... 20 и так далее. Вместо этого мне бы хотелось, чтобы ни одна ячейка не оставалась обрезанной выше или ниже представления, когда я прокручиваю (таким образом, разбиваю на страницы), не имея своего рода фиксированного диапазона показанных ячеек.

Большое спасибо

Ответы [ 5 ]

17 голосов
/ 01 августа 2012

Более просто и эффективнее:)

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

    if(decelerate) return;

    [self scrollViewDidEndDecelerating:scrollView];
}


- (void)scrollViewDidEndDecelerating:(UITableView *)tableView {

    [tableView scrollToRowAtIndexPath:[tableView indexPathForRowAtPoint: CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y+tableView.rowHeight/2)] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
13 голосов
/ 26 февраля 2010

Просто, но эффективно:

    - (void)scrollViewDidEndDecelerating:(UITableView *)tableView {
            int tomove = ((int)tableView.contentOffset.y%(int)tableView.rowHeight);
            if(tomove < tableView.rowHeight/2) [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y-tomove) animated:YES];
            else [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y+(tableView.rowHeight-tomove)) animated:YES];
    }

    - (void)scrollViewDidEndDragging:(UITableView *)scrollView willDecelerate:(BOOL)decelerate {
            if(decelerate) return;

            [self scrollViewDidEndDecelerating:scrollView];
    }
5 голосов
/ 08 июля 2014

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

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset
{    
    CGFloat rowHeight = tableView.rowHeight;
    int verticalOffset = ((int)targetContentOffset->y % (int)rowHeight);
    if (velocity.y < 0)
    {
        targetContentOffset->y -= verticalOffset;
    }
    else if (velocity.y > 0)
    {
        targetContentOffset->y += (rowHeight - verticalOffset);
    }
    // No velocity, snap to closest page
    else
    {
        if (verticalOffset < rowHeight / 2)
        {
            targetContentOffset->y -= verticalOffset;
        }
        else
        {
            targetContentOffset->y += (rowHeight - verticalOffset);
        }
    }    
}

Обратите внимание, что дополнительно устанавливается

 self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;

в viewDidLoad: делает его ближе к реальной вещи, но не совсем.

Я возился с настройкой еще более высоких скоростей замедления, используя код , показанный здесь , но я не смог сделать это правильно.

4 голосов
/ 17 августа 2013

Это работает как настоящий пейджинг:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset
{
    int tomove = ((int)targetContentOffset->y % (int)self.tableView.rowHeight);
    if(tomove < self.tableView.rowHeight/2)
        targetContentOffset->y -= tomove;
    else 
        targetContentOffset->y += (self.tableView.rowHeight-tomove);
}

и сделайте это в -viewDidLoad:

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
3 голосов
/ 30 июня 2015

А в Свифте ...

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        self.scrollViewDidEndDecelerating(scrollView)
    }
}

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    if let indexPathToScrollTo: NSIndexPath = self.tableView.indexPathForRowAtPoint(CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y+tableView.rowHeight/2)) {
        self.tableView.scrollToRowAtIndexPath(indexPathToScrollTo, atScrollPosition: UITableViewScrollPosition.Top, animated: true)
    }
}
...