计算UITableView在哪一行停止滚动?

时间:2011-05-24 20:53:37

标签: iphone uitableview scroll gesture

当表格有很多行时,用户可以向上/向下滑动表格。这创建了滚动动画,其似乎具有确定长度,这取决于轻拂手势的速度/长度。如果没有进一步的用户交互,滚动停止后,是否可以可靠地计算表中哪些行可见?

4 个答案:

答案 0 :(得分:5)

在iOS 5.0及更高版本中,UIScrollViewDelegate有一个名为scrollViewWillEndDragging:withVelocity:targetContentOffset:的新API。使用这种新方法,可以计算甚至修改滚动的停止位置,如Video Session 100: What's New in Cocoa Touch中所述,在第九分钟左右。

答案 1 :(得分:1)

UITableView继承自UIScrollView,您可以通过使用UIScrollViewDelegate方法和表视图indexPathsForVisibleRows属性来检查目前可见的单元索引路径滚动停止。

您甚至可以保存减速开始位置的初始位置,这样您就可以计算出滚动方向是向上还是向下,然后会告诉您它将停止的单元格是第一个还是最后一个可见的。

int startDeceleratingPosition;

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {

    startDeceleratingPosition = scrollView.contentOffset.y;

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    BOOL isPositionUp = startDeceleratingPosition < scrollView.contentOffset.y;     

    NSArray *paths = [_myTableview indexPathsForVisibleRows];
    UITableViewCell *cell;
    if(isPositionUp){
        cell = [_myTableview cellForRowAtIndexPath:[paths objectAtIndex:0]];
    } else {
        cell = [_myTableview cellForRowAtIndexPath:[paths lastObject]];
    }

}

关于上面代码的一个重要注意事项是,它将表视图指向为变量_myTableview,而不是仅将委托方法变量scrollView转换为UITableView *,尽管这是只是实现细节,不应该影响这里的逻辑。

答案 2 :(得分:0)

有趣的问题..... UITableViewDelegate也符合UIScrollViewDelegatehttp://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html#//apple_ref/occ/intf/UIScrollViewDelegate

您可以使用一些委托回调来了解滚动何时开始减速,并结束减速。

您可以使用– scrollViewDidEndDecelerating:并在此时使用tableView(tableView子类UIScrollView)的单元格高度和内容偏移属性,然后计算减速后可见的单元格。

答案 3 :(得分:-1)

我不知道如何确定将显示多少行,但您总是可以获得已显示的行数。 (一旦桌子停止w /不再触摸。) 不确定这是否有帮助,但这就是你要做的事情

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    // make sure to declare your integer in your .h file and to also synthesize
    //say this is your int "howManyRowsAreShowing"
    howManyRowsAreShowing = indexPath.Row;



    //the rest of the code below is generic table view code for example only
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...
    NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
    cell.text = cellValue;

    return cell;
    }