启用分页时的UITableView页面大小

时间:2010-02-25 15:38:15

标签: objective-c uitableview iphone-sdk-3.0 paging

我面临着一个简单但又乏味的问题。 我正在尝试做的是使UITableView像UIScrollView一样页面,但是启用分页对我没有多大帮助,因为我无法设置页面大小,因此tableview完全滚动其高度,因此它显示行1 ... 10或11 ...... 20等等。 我想要的是,当我滚动(因此进行分页)而没有显示一系列固定单元格时,没有单元格在视图上方或下方被剪裁。

非常感谢

5 个答案:

答案 0 :(得分:17)

更简单,更高效:)

- (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];
}

答案 1 :(得分:13)

简单但高效:

    - (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];
    }

答案 2 :(得分:5)

k06a's answer开始,我对它进行了一些改进,使其更像真正的分页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;
<{1>}中的

使它更接近真实的东西,但并不完全。

我一直在努力使用code shown here设置更快的减速率,但我无法做到正确。

答案 3 :(得分:4)

这就像真正的分页一样:

- (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;

答案 4 :(得分:3)

在斯威夫特......

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)
    }
}