Cocos2d-x提供了CCTableView类,用于创建列表,那么如何定位到列表指定的行呢;
CCTableView继承自CCScrollView,打开CCScrollView会发现有个setContentOffset方法;
该方法即用于设定列表的位置。参数offset指定列表停放的位置,animated如果为true则以MoveTo滚动的方式延迟到达指定offset,如果为false,则直接setPostion到offset;
如果在初始化的时候使用setContentOffset定位到列表某行,则需将setContentOffset放在reloadData()之后;
那么问题来了,如何定位offset呢?引擎没有提供相应的接口,我们只能自己计算(这里只计算offsety,offsetx=0):
/*
viewHeight:可视区域的高度
cellHeight:单个cell的高度
cellCount:cell的总数
cellCountShown:可视区域可显示的cell的数量
cellIndex:需要指定的cell的索引,从0开始计数
locationindex:需要将cellIndex放到可视区域的第几个,从1开始
*/
float calculateTableCellOffsetByCellIdx(float viewHeight, float cellHeight, int cellCount, int cellCountShown, int cellIndex, int locationindex) {
float tableTotalHeight = cellHeight * cellCount;
if(tableTotalHeight > viewHeight) {
return 0.00 - (cellCount - (cellIndex + cellCountShown - locationindex + 1)) * cellHeight;
}
else{
return viewHeight - tableTotalHeight;
}
}
如果我们有一个有15个元素的TableView,一屏可以显示5个,我们要将第3个元素定位到第二行的位置,那么我们可以这样计算offsety:
float offsety = calculateTableCellOffsetByCellIdx(TableView->getViewSize().height, cellSize.height, 15, 5, 3, 2);
TableView->setContentOffset( ccp(0, offsety), false);
注意:
1、获取TableView的ViewSize而不是Contentsize;
2、setContentsizeOffset必须在reloadData()之后调用;