CocosUI之TableView
2016-04-16 14:46
357 查看
TableView(更好用的滑动窗口)
基本应用
TableView* tableView =TableView::create(sou, Size(49*5,47)); addChild(tableView);
创建TableView的参数1是一个TableViewDataSource的对象,参数2则是显示窗口的大小。
同样,也有一堆属性设置:
tableView->setDirection(ScrollView::Direction::HORIZONTAL);
tableView->reloadData();
tableView->setPosition(winSize.width/ 2, winSize.height / 2);
注意的是:这个reloadData很重要,每逢信息变更想要显示,必须reload一下
TableViewDataSource:
1. 这个类是一个纯虚类
2. 必须重载2纯虚函数:tableCellAtIndex(回调函数)和numberOfCellInTableView(返回拥有的cell数目),当然还有2个可重载函数。这些虚函数本质上是设置函数,其return的值就是我们要动态设置的值。
3. 这样来理解:TableViewDataSource相当于ScrollView中的node,TableViewCell则相当于node中的精灵(其实Cell是存放精灵的),这个类将ScrollView进行了更良好的封装以便用。
4. Cell的大小
定义这个数据封装类:
class
MyTableViewDataSouce : public
TableViewDataSource
{
public:
Vector<TableViewCell*> _cells; //用Vector来做存放TableViewCell的容器
// Size winSize =Director::getInstance()->getWinSize();
Size itemSize =
Size(49, 47); //这个size是tableCell的大小
MyTableViewDataSouce()
{
for (int i = 0; i < 11;i++)
{
TableViewCell* cell =
TableViewCell::create();cell中不能直接放入图片,只是一个继承自Node的类,必须add精灵
_cells.pushBack(cell);
Sprite* sprite =
Sprite::create("Images/r1.png");
cell->addChild(sprite);
sprite->setPosition(itemSize.width/ 2, itemSize.height / 2);
}
}
/*这个函数设置cell的大小,参数1是调用这个函数的TableView,参数2是一个序号即cell的序号 */
非必须重载virtual
SizetableCellSizeForIndex(TableView *table,
ssize_t idx) {
#if 0
if (idx == 3)
{
return Size(itemSize.width* 2, itemSize.height);
}
#endif
return cellSizeForTable(table);
};
非必须重载virtual
Size cellSizeForTable(TableView *table) {
// return winSize;
return itemSize;
}
/* 返回idx指定的那个Cell */
必须重载virtual
TableViewCell* tableCellAtIndex(TableView *table,
ssize_t idx)
{
return _cells.at(idx);
}
/*返回有几个cells*/
必须重载virtual
ssize_tnumberOfCellsInTableView(TableView *table)
{
return _cells.size();
}
};
使用:考虑不愿意delete,只能用局部变量
MyTableViewDataSouce _source;
MyTableViewDataSouce* sou =&_source;
然后将这个对象放入TableView就可以了。
总结:TableView就是对ScrollView封装,将数据维护交给了TableViewDataSource,同样的我们也可以在其中做触摸处理,这一点和ScrollView是一样的。
但很重要的一点是:TableViewDataSource中的虚函数其实都是设置函数,如这一段函数用处是当idx为3时设置2倍宽度的Cell(注意是Cell,不是Cell中的精灵,但是通常我们把Cell和精灵设为一样大的)
virtual
SizetableCellSizeForIndex(TableView *table,
ssize_t idx)
{
if (idx == 3)
{
return Size(itemSize.width* 2, itemSize.height);
}
return cellSizeForTable(table);
}
添加触摸
TableView的触摸是通过TableViewDelegate做到的1. 创建某个继承自TableViewDelegate类的类,或者让调用这个TableView的类(通常是Layer子类)继承这个类,第二种方式更易于做些操作。
2. 重载回调纯虚函数tableCellTouched:两个参数,一个是被点的table一个是被点的cell
virtual
void tableCellTouched(TableView*
table, TableViewCell*
cell)
{ //这个回调完成删除被点击的Cell
int idx =
cell->getIdx();
_source._cells.eraseObject(cell);
table->reloadData();//每次做出数据变更总应该reload一下
CCLOG("idx=%d", idx);
}
3. 为需要的TableView添加代理对象(即继承的这个类对象)
tableView->setDelegate(this);
ScrollView也有代理,但是这个代理只有2个虚函数
TableViewDelegate 继承自ScrollViewDelegate
这个代理的其他虚函数可见源码
相关文章推荐
- CocosUI之ScrollView
- CocosUI之colorswitch和Slider
- CocosUI之九妹图和编辑框
- Cocos格子地图(3)
- Cocos格子地图(2)
- Cocos格子地图(1)
- cocos2dx的数据保存之UserDault
- cocos2dx+lua注册事件函数详解
- Cocos2d-x移植android增加震动效果
- cocos2d-lua 下使用protobuffer
- cocos2d_lua播放动画
- cocos2d-x自制工具07:打印cocos2d-x的节点树
- cocos2dx 压缩图片的网站/工具
- 个人初做小游戏RunRunMagic(五) 总结
- cocos模拟器已经启动 但是不能访问6010端口
- class() 高级用法 --cocos2dx- lua
- Cocos2dx 3.x的android studio项目之间.so库、资源移植
- cocos2d-x 3.x DrawNode的使用
- mac下创建cocos2d-x的android项目详细流程
- cocos2d-x3.0 macOS下配置Android开发环境以及使用cocos2d-console来新建执行project