当表格有很多行时,用户可以向上/向下滑动表格。这创建了滚动动画,其似乎具有确定长度,这取决于轻拂手势的速度/长度。如果没有进一步的用户交互,滚动停止后,是否可以可靠地计算表中哪些行可见?
答案 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
也符合UIScrollViewDelegate
:http://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;
}