JMPageView.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. cc.Class({
  2. extends: cc.Component,
  3. editor: {
  4. menu: '嘉米公用/JMPageView'
  5. },
  6. properties: {
  7. pageView: cc.PageView,
  8. contentPrefab: cc.Prefab
  9. },
  10. /**
  11. * 导出creator pageview接口
  12. * 避免this.pageView.pageView.getCurrentPageIndex()写法
  13. *
  14. * @author libo
  15. * @date 2019-04-29
  16. * @returns
  17. */
  18. getCurrentPageIndex () {
  19. return this.pageView.getCurrentPageIndex();
  20. },
  21. onLoad () {
  22. this.pageView.node.on('scroll-ended', this.handlePageScrollEnded, this);
  23. this.pageView.node.on('scrolling', this.handlePageScrolling, this);
  24. this.pageView.node.on('page-turning', this.handlePageTurning, this);
  25. },
  26. reloadData (data, cb) {
  27. this.data = data;
  28. this.cb = cb;
  29. this.pageView.removeAllPages();
  30. for (let i = 0; i < data.length; i++) {
  31. let node = new cc.Node(i);
  32. node.width = this.pageView.node.width;
  33. node.height = this.pageView.node.height;
  34. this.pageView.addPage(node);
  35. }
  36. // 默认显示第一页
  37. this.jumpPageByIdx(0);
  38. },
  39. /**
  40. * 根据索引刷新页面
  41. *
  42. * @author libo
  43. * @date 2019-04-29
  44. * @param {number} idx 页面索引
  45. * @returns
  46. */
  47. reloadPageByIdx (idx) {
  48. if (idx < 0 || idx >= this.data.length) {
  49. return;
  50. }
  51. let page = this.getPageByIdx(idx);
  52. let contentNode = cc.instantiate(this.contentPrefab);
  53. contentNode.parent = page;
  54. // 通过消息初始化预制体
  55. // contentNode.emit('jm_msg_reloadData', this.data[idx], this.cb);
  56. // 通过循环组件查询有没有reloadData初始化
  57. for (const cmpt of contentNode._components) {
  58. if (cmpt.reloadData) {
  59. cmpt.reloadData(this.data[idx], this.cb);
  60. }
  61. }
  62. },
  63. /**
  64. * 根据索引跳转到指定页面
  65. *
  66. * @author libo
  67. * @date 2019-04-29
  68. * @param {*} idx
  69. */
  70. jumpPageByIdx (idx) {
  71. // creator bug:
  72. // PageView的addPage 和 content的Layout ResizeMode CONTAINER冲突了
  73. // 强制调用updateLayout也一样无效
  74. // 所以需要加个定时器到下一帧执行 或者 默认给content一个大小并且关闭CONTAINER模式
  75. // 否则初始化调用的时候渲染不了界面
  76. this.scheduleOnce(() => {
  77. this.pageView.scrollToPage(idx);
  78. }, 0);
  79. },
  80. jumpPrePage () {
  81. let pageIdx = this.pageView.getCurrentPageIndex() - 1;
  82. if (!this.hasPageContentByIdx(pageIdx)) {
  83. this.reloadPageByIdx(pageIdx);
  84. }
  85. this.pageView.scrollToPage(pageIdx);
  86. },
  87. jumpNextPage () {
  88. let pageIdx = this.pageView.getCurrentPageIndex() + 1;
  89. if (!this.hasPageContentByIdx(pageIdx)) {
  90. this.reloadPageByIdx(pageIdx);
  91. }
  92. this.pageView.scrollToPage(pageIdx);
  93. },
  94. handlePageScrolling (sender) {
  95. let pageHeight = this.pageView.node.height;
  96. let PageWidth = this.pageView.node.width;
  97. let offsetPos = this.pageView.getScrollOffset();
  98. let currPageIdx = sender.getCurrentPageIndex();
  99. let newPageIdx = currPageIdx;
  100. let offset = 0;
  101. if (offsetPos.x != 0) {
  102. // 横向
  103. offset = currPageIdx * PageWidth + offsetPos.x;
  104. } else {
  105. // 纵向
  106. offset = currPageIdx * pageHeight - offsetPos.y;
  107. }
  108. newPageIdx;
  109. if (offset > 0) {
  110. newPageIdx -= 1;
  111. }
  112. if (offset < 0) {
  113. newPageIdx += 1;
  114. }
  115. if (!this.hasPageContentByIdx(currPageIdx)) {
  116. this.reloadPageByIdx(currPageIdx);
  117. }
  118. // if (!this.hasPageContentByIdx(newPageIdx)) {
  119. // this.reloadPageByIdx(newPageIdx);
  120. // }
  121. },
  122. handlePageScrollEnded (sender) {
  123. let idx = sender.getCurrentPageIndex();
  124. this.removeOtherPagesContent(idx);
  125. },
  126. handlePageTurning (sender) {
  127. if (this.cb) {
  128. let idx = sender.getCurrentPageIndex();
  129. this.cb('pageTurnDone', idx);
  130. }
  131. },
  132. getPageByIdx (idx) {
  133. let pages = this.pageView.getPages();
  134. for (const page of pages) {
  135. if (page.name == idx) {
  136. return page;
  137. }
  138. }
  139. return undefined;
  140. },
  141. hasPageContentByIdx (idx) {
  142. let page = this.getPageByIdx(idx);
  143. if (page && page.childrenCount > 0) {
  144. return true;
  145. }
  146. return false;
  147. },
  148. removeOtherPagesContent (currIdx) {
  149. let pages = this.pageView.getPages();
  150. for (const page of pages) {
  151. if (page.name != currIdx) {
  152. page.removeAllChildren();
  153. }
  154. }
  155. }
  156. });