TableView

在手机游戏的开发中,滚动是一项非常重要的操作,而cocos2dx中使用的最广泛的就属于TableView了,不过由于cocos2dx的接口比较晦涩,所以需要一个熟悉的过程。本文主要讲解如何使用TableView。

首先当然是创建一个TableView,这比较简单,和其他控件差不多。看看示例代码:

self._skillView = cc.TableView:create(cc.size(winSize.width / 3 - 50, winSize.height - 140))
self._skillView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)    
self._skillView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
self._skillView:setPosition(cc.p(50, 10))
self._skillView:setDelegate()
skill_bg:addChild(self._skillView)

需要注意的是setDirection的参数,cc.SCROLLVIEW_DIRECTION_VERTICAL表示在垂直方向滚动,cc.SCROLLVIEW_DIRECTION_HORIZONTAL则表示在水平方向滚动。
其次为TableView设置一些回调函数。主要有4个回调函数。先看看示例代码:

self._skillView:registerScriptHandler(SkillBoard.tableCellTouched, cc.TABLECELL_TOUCHED)
self._skillView:registerScriptHandler(SkillBoard.cellSizeForTable, cc.TABLECELL_SIZE_FOR_INDEX)
self._skillView:registerScriptHandler(SkillBoard.tableCellAtIndex, cc.TABLECELL_SIZE_AT_INDEX)
self._skillView:registerScriptHandler(SkillBoard.numberOfCellsInTableView, cc.NUMBER_OF_CELLS_IN_TABLEVIEW)

TABLECELL_TOUCHED:TableView被触摸的时候的回调,主要用于选择TableView中的Cell。
TABLECELL_SIZE_FOR_INDEX:此回调需要返回TableView中Cell的尺寸大小。

TABLECELL_SIZE_AT_INDEX:此回调需要为TableView创建在某个位置的Cell。

NUMBER_OF_CELLS_IN_TABLEVIEW:此回调需要返回TableView中Cell的数量。
然后,我们先看最简单的两个回调函数的示例:

function SkillBoard.cellSizeForTable(view, idx)
return 200, 200
end

function SkillBoard.numberOfCellsInTableView(view)
return table.size(local_skills)
end
参数中的view表示TableView对象,idx表示Cell的索引。

再次,我们看看触摸函数,参数cell表示哪一个cell被触摸到了。

function SkillBoard.tableCellTouched(view, cell)
local self = GUI.GetGUI("SkillBoard")
if self:isOpened() then
for cl, sitem in pairs(self._skillItems) do
local issel = (cl == cell)
sitem:select(issel)
if issel then
self:onClickSkill(sitem:getSkill())
end
end
end
end
最后,看看最重要的函数,就是映射cell的接口,idx表示cell的索引。

function SkillBoard.tableCellAtIndex(view, idx)
local self = GUI.GetGUI("SkillBoard")
local cell = view:dequeueCell()
if not cell then
cell = cc.TableViewCell:new()
end
return cell
end
是不是特别简单呢?如果需要多样化的cell,比如物品栏,技能栏这些功能,只需要在cell上扩展,创建一些精灵或者按钮,作为cell的子节点加到cell上即可。例如:
cell = cc.TableViewCell:new()
local image1 = CHOOSE_SERVER_AREA_NORMAL
local sprite1 = cc.Sprite:createWithSpriteFrameName(image1)
sprite1:setAnchorPoint(cc.p(0, 0))
sprite1:setPosition(cc.p(0, 0))
sprite1:setTag(1)
cell:addChild(sprite1)

    local image2 = CHOOSE_SERVER_AREA_SELECTED
    local sprite2 = cc.Sprite:createWithSpriteFrameName(image2)
    sprite2:setAnchorPoint(cc.p(0, 0))
    sprite2:setPosition(cc.p(0, 0))
    sprite2:setTag(2)
    cell:addChild(sprite2)

    local label = cc.Label:createWithSystemFont(strValue, DEFAULT_FONT_TTF, 20)
    label:setAnchorPoint(cc.p(0.5, 0.5))
    label:setPosition(cc.p(77, 30))
    label:setTag(3)
    cell:addChild(label)
好了,基本的使用方法就如此了,但是。。但是,还有最重要的一点,需要大家注意的。

numberOfCellsInTableView返回的个数和TableView创建的cell数量通常是不一样的,这是因为cocos2dx设计上为了节省资源,创建的cell数量 = tabview的高度 / 单个cell的高度 + 1。所以在触摸和选中等逻辑处理的时候,一定不能使用cell来标识。因为同一个cell物理对象,可能会映射N个逻辑对象。

通常我的做法是在tableCellAtIndex中把当前cell对应的逻辑对象存起来,这样在tableCellTouched就可以直接找到物理cell对应的逻辑对象来处理了。

作者:帘卷西风
来源:CSDN
原文:https://blog.csdn.net/ljxfblog/article/details/39696475
版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1、创建tableview self.uiRankList = cc.TableView:create(cc.si...
    Nimanggi阅读 1,140评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • [ ] 准备阶段:数据层model​ 请求数据-ContactsService ​ 写一个mock网络请求获取JS...
    Edie小哪吒阅读 477评论 0 2
  • 《iOS 列表性能优化之异步绘制[https://mp.weixin.qq.com/s/AX-WY2HalDKE6...
    goyohol阅读 287评论 0 1
  • 时而多愁善感, 时而不会去考虑一丝一毫 如此,我也并不怪. 爱,便爱,不爱,也不过不爱. 从来不乞求谁爱我, 就算...
    2846f281700a阅读 212评论 0 0