TableViewEx.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. local TableViewEx = class("TableViewEx", function() return ccui.Layout:create() end)
  2. function TableViewEx:ctor(data)
  3. self._tableView = nil
  4. self._data = nil
  5. end
  6. --[[
  7. @desc: tableView参数
  8. --@data: {
  9. size = cc.size(xx, xx), --视图大小, 必须有
  10. scrollViewDidScroll = function(view) end, --滚动时点击事件
  11. cellSizeForTable = function(view, idx) end, --子视图大小 view是tableview, idx是每个子项的索引, 必须有
  12. tableCellAtIndex = function(view, idx) end, --获取子视图, 必须有
  13. numberOfCellsInTableView = function(view) end, 子视图数目 返回的个数是tableview的高度/单个子项的高度+1, 必须有
  14. tableCellTouched = function(view, cell) end, --触摸列表项cell的回调
  15. direction = 0 or 1 --方向设置0水平 1竖直
  16. }
  17. @return: TableViewEx
  18. ]]
  19. function TableViewEx.create(data)
  20. local cell = TableViewEx.new()
  21. if cell and cell:Init(data) then
  22. return cell
  23. end
  24. return nil
  25. end
  26. function TableViewEx:Init(data)
  27. if not data.size or not data.cellSizeForTable or not data.tableCellAtIndex or not data.numberOfCellsInTableView then
  28. return nil
  29. end
  30. self._data = data
  31. self._cColor = cc.c4b(200, 200, 200, 255)
  32. --@RefType[luaIde#cc.TableView]
  33. self._tableView = cc.TableView:create(self._data.size or cc.size(100, 66))
  34. self:addChild(self._tableView)
  35. --设置滚动方向 SCROLLVIEW_DIRECTION_VERTICAL是垂直滚动 SCROLLVIEW_DIRECTION_HORIZONTAL 是水平滚动
  36. self._tableView:setDirection(self._data.direction or cc.SCROLLVIEW_DIRECTION_VERTICAL)
  37. --竖直从上往下排列
  38. self._tableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
  39. --设置代理
  40. self._tableView:setDelegate()
  41. -- 自定义函数
  42. self._tableView.scrollToCell = function(tv, index, animated)
  43. self:scrollToCell(index, animated)
  44. end
  45. self:registerScriptHandler()
  46. return true
  47. end
  48. --添加回调函数
  49. function TableViewEx:registerScriptHandler()
  50. --滚动时回调
  51. self._tableView:registerScriptHandler(
  52. handler(self, self._data.scrollViewDidScroll or self.scrollViewDidScroll), cc.SCROLLVIEW_SCRIPT_SCROLL
  53. )
  54. --列表项的尺寸
  55. self._tableView:registerScriptHandler(
  56. handler(self, self._data.cellSizeForTable or self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX
  57. )
  58. --创建列表项
  59. self._tableView:registerScriptHandler(
  60. handler(self, self._data.tableCellAtIndex or self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX
  61. )
  62. --列表项的数量
  63. self._tableView:registerScriptHandler(
  64. handler(self, self._data.numberOfCellsInTableView or self.numberOfCellsInTableView), cc.NUMBER_OF_CELLS_IN_TABLEVIEW
  65. )
  66. --触摸列表项cell的回调
  67. self._tableView:registerScriptHandler(self._data.tableCellTouched or self.tableCellTouched, cc.TABLECELL_TOUCHED)
  68. --加载tableView的所有列表数据
  69. self._tableView:reloadData()
  70. end
  71. --滚动时点击事件
  72. function TableViewEx:scrollViewDidScroll(view)
  73. end
  74. --子视图大小 view是tableview, idx是每个子项的索引
  75. function TableViewEx:cellSizeForTable(view, idx)
  76. return 100, 66
  77. end
  78. --子视图数目 返回的个数是tableview的高度/单个子项的高度+1
  79. function TableViewEx:numberOfCellsInTableView(view)
  80. return 1
  81. end
  82. --触摸列表项cell的回调
  83. function TableViewEx:tableCellTouched(cell)
  84. end
  85. --[[
  86. 往cell里加入的控件不要有裁剪内容的选择项,否则会显示不正确
  87. ]]
  88. --获取子视图
  89. function TableViewEx:tableCellAtIndex(view, idx)
  90. local index = idx + 1
  91. local cell = view:dequeueCell()
  92. if not cell then
  93. cell = cc.TableViewCell:new()
  94. else
  95. cell:removeAllChildren()
  96. end
  97. return cell
  98. end
  99. --@return [luaIde#cc.TableViewCell]
  100. function TableViewEx:cellAtIndex(index)
  101. return self._tableView:cellAtIndex(index)
  102. end
  103. function TableViewEx:removeCellAtIndex(index)
  104. self._tableView:removeCellAtIndex(index)
  105. end
  106. function TableViewEx:reloadData()
  107. self._tableView:reloadData()
  108. end
  109. function TableViewEx:reloadDataEx()
  110. local oldOffset = self:getContentOffset()
  111. self._tableView:reloadData()
  112. local offset = self:getContentOffset()
  113. local dir = self:getDirection()
  114. local off1 = dir == cc.SCROLLVIEW_DIRECTION_VERTICAL and oldOffset.y or oldOffset.x
  115. local off2 = dir == cc.SCROLLVIEW_DIRECTION_VERTICAL and offset.y or offset.x
  116. if off1 <= 0 and off2 < 0 then
  117. self:setContentOffset(oldOffset)
  118. end
  119. end
  120. function TableViewEx:getContentOffset()
  121. return self._tableView:getContentOffset()
  122. end
  123. function TableViewEx:setContentOffset(point, animated)
  124. return self._tableView:setContentOffset(point, animated)
  125. end
  126. function TableViewEx:getViewSize()
  127. return self._tableView:getViewSize()
  128. end
  129. function TableViewEx:setViewSize(size)
  130. return self._tableView:setViewSize(size)
  131. end
  132. function TableViewEx:scrollToCell(index, animated)
  133. local point = self._tableView:getContentOffset()
  134. local cell = self._tableView:cellAtIndex(index)
  135. local size = cc.size(self._data.cellSizeForTable())
  136. local direction = self._tableView:getDirection()
  137. if direction == cc.SCROLLVIEW_DIRECTION_HORIZONTAL then
  138. point.x = -((index - 1) * size.width)
  139. else
  140. index = self._data.numberOfCellsInTableView() - index
  141. point.y = -((index - 1) * size.height)
  142. end
  143. -- 检查偏移量是否越界
  144. local maxInset = self._tableView:maxContainerOffset();
  145. local minInset = self._tableView:minContainerOffset();
  146. point.x = cc.clampf(point.x ,minInset.x,maxInset.x)
  147. point.y = cc.clampf(point.y ,minInset.y,maxInset.y)
  148. self:setContentOffset(point, animated)
  149. end
  150. --[[
  151. @desc:
  152. --@color: c4b格式
  153. ]]
  154. function TableViewEx:SetBackColor(color)
  155. self._cColor = color or self._cColor
  156. if self._backColor then
  157. self._backColor:removeSelf()
  158. end
  159. self._backColor = cc.LayerColor:create(self._cColor)
  160. self._backColor:setContentSize(self:getViewSize())
  161. self._backColor:addTo(self, -1)
  162. end
  163. function TableViewEx:GetBackColor()
  164. return self._cColor
  165. end
  166. function TableViewEx:setContentSize(size)
  167. self:setViewSize(size)
  168. if self._backColor then
  169. self._backColor:setContentSize(size)
  170. end
  171. end
  172. function TableViewEx:getContentSize()
  173. return self:getViewSize()
  174. end
  175. function TableViewEx:setDirection( direction )
  176. self._data.direction = direction
  177. self._tableView:setDirection(self:getDirection())
  178. self._tableView:reloadData()
  179. end
  180. function TableViewEx:getDirection()
  181. return self._data.direction or cc.SCROLLVIEW_DIRECTION_VERTICAL
  182. end
  183. function TableViewEx:getDirectionEx()
  184. return ({[cc.SCROLLVIEW_DIRECTION_VERTICAL] = 1, [cc.SCROLLVIEW_DIRECTION_HORIZONTAL] = 2})[self:getDirection()] or 1
  185. end
  186. function TableViewEx:setVerticalFillOrder( order )
  187. self._tableView:setVerticalFillOrder(order)
  188. end
  189. function TableViewEx:setTableCellAtIndexHandler( func )
  190. self._data.tableCellAtIndex = func
  191. self:registerScriptHandler()
  192. end
  193. function TableViewEx:setTableCellTouchedHandler( func )
  194. self._data.tableCellTouched = func
  195. self:registerScriptHandler()
  196. end
  197. function TableViewEx:setTableViewScrollHandler( func )
  198. self._data.scrollViewDidScroll = func
  199. self:registerScriptHandler()
  200. end
  201. function TableViewEx:setTableViewCellsNumHandler( func )
  202. if type(func) == "number" then
  203. self._data.numberOfCellsInTableView = function ()
  204. return func
  205. end
  206. else
  207. self._data.numberOfCellsInTableView = func
  208. end
  209. local oldOffset = self:getContentOffset()
  210. self:registerScriptHandler()
  211. local offset = self:getContentOffset()
  212. local dir = self:getDirection()
  213. local off1 = dir == cc.SCROLLVIEW_DIRECTION_VERTICAL and oldOffset.y or oldOffset.x
  214. local off2 = dir == cc.SCROLLVIEW_DIRECTION_VERTICAL and offset.y or offset.x
  215. if off1 <= 0 and off2 < 0 then
  216. self:setContentOffset(oldOffset)
  217. end
  218. end
  219. function TableViewEx:setTouchEnabled(bool)
  220. self._tableView:setTouchEnabled(bool)
  221. end
  222. function TableViewEx:getCellSize()
  223. local size = {width = 0, height = 0}
  224. if self._data.cellSizeForTable then
  225. size.width, size.height = self._data.cellSizeForTable()
  226. else
  227. size.width, size.height = self.cellSizeForTable()
  228. end
  229. return size
  230. end
  231. function TableViewEx:getTotalCellNums()
  232. local func = self._data.numberOfCellsInTableView or self.numberOfCellsInTableView
  233. return func()
  234. end
  235. function TableViewEx:addMouseScrollEvent(call_scrolling)
  236. local function __OnMouseScroll(sender)
  237. if not GetWidgetVisible(self) then
  238. return false
  239. end
  240. if not call_scrolling or type(call_scrolling) ~= "function" then
  241. return false
  242. end
  243. local mousePosX = sender:getCursorX()
  244. local mousePosY = sender:getCursorY()
  245. local isInSide = global.mouseEventController:checkNodePos(self, {x = mousePosX, y = mousePosY})
  246. if not isInSide then
  247. return false
  248. end
  249. local scrollX = sender:getScrollX()
  250. local scrollY = sender:getScrollY()
  251. call_scrolling({widget = self, x = scrollX, y = scrollY})
  252. end
  253. local listener = cc.EventListenerMouse:create()
  254. listener:registerScriptHandler(__OnMouseScroll, cc.Handler.EVENT_MOUSE_SCROLL)
  255. cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, self)
  256. end
  257. function TableViewEx:unregisterScriptHandler()
  258. self._tableView:unregisterScriptHandler(cc.SCROLLVIEW_SCRIPT_SCROLL)
  259. self._tableView:unregisterScriptHandler(cc.TABLECELL_SIZE_FOR_INDEX)
  260. self._tableView:unregisterScriptHandler(cc.TABLECELL_SIZE_AT_INDEX)
  261. self._tableView:unregisterScriptHandler(cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
  262. self._tableView:unregisterScriptHandler(cc.TABLECELL_TOUCHED)
  263. end
  264. return TableViewEx