123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- cc.Class({
- extends: cc.Component,
- editor: {
- menu: '嘉米公用/JMPageView'
- },
- properties: {
- pageView: cc.PageView,
- contentPrefab: cc.Prefab
- },
- /**
- * 导出creator pageview接口
- * 避免this.pageView.pageView.getCurrentPageIndex()写法
- *
- * @author libo
- * @date 2019-04-29
- * @returns
- */
- getCurrentPageIndex () {
- return this.pageView.getCurrentPageIndex();
- },
- onLoad () {
- this.pageView.node.on('scroll-ended', this.handlePageScrollEnded, this);
- this.pageView.node.on('scrolling', this.handlePageScrolling, this);
- this.pageView.node.on('page-turning', this.handlePageTurning, this);
- },
- reloadData (data, cb) {
- this.data = data;
- this.cb = cb;
- this.pageView.removeAllPages();
- for (let i = 0; i < data.length; i++) {
- let node = new cc.Node(i);
- node.width = this.pageView.node.width;
- node.height = this.pageView.node.height;
- this.pageView.addPage(node);
- }
- // 默认显示第一页
- this.jumpPageByIdx(0);
- },
- /**
- * 根据索引刷新页面
- *
- * @author libo
- * @date 2019-04-29
- * @param {number} idx 页面索引
- * @returns
- */
- reloadPageByIdx (idx) {
- if (idx < 0 || idx >= this.data.length) {
- return;
- }
- let page = this.getPageByIdx(idx);
- let contentNode = cc.instantiate(this.contentPrefab);
- contentNode.parent = page;
- // 通过消息初始化预制体
- // contentNode.emit('jm_msg_reloadData', this.data[idx], this.cb);
- // 通过循环组件查询有没有reloadData初始化
- for (const cmpt of contentNode._components) {
- if (cmpt.reloadData) {
- cmpt.reloadData(this.data[idx], this.cb);
- }
- }
- },
- /**
- * 根据索引跳转到指定页面
- *
- * @author libo
- * @date 2019-04-29
- * @param {*} idx
- */
- jumpPageByIdx (idx) {
- // creator bug:
- // PageView的addPage 和 content的Layout ResizeMode CONTAINER冲突了
- // 强制调用updateLayout也一样无效
- // 所以需要加个定时器到下一帧执行 或者 默认给content一个大小并且关闭CONTAINER模式
- // 否则初始化调用的时候渲染不了界面
- this.scheduleOnce(() => {
- this.pageView.scrollToPage(idx);
- }, 0);
- },
- jumpPrePage () {
- let pageIdx = this.pageView.getCurrentPageIndex() - 1;
- if (!this.hasPageContentByIdx(pageIdx)) {
- this.reloadPageByIdx(pageIdx);
- }
- this.pageView.scrollToPage(pageIdx);
- },
- jumpNextPage () {
- let pageIdx = this.pageView.getCurrentPageIndex() + 1;
- if (!this.hasPageContentByIdx(pageIdx)) {
- this.reloadPageByIdx(pageIdx);
- }
- this.pageView.scrollToPage(pageIdx);
- },
- handlePageScrolling (sender) {
- let pageHeight = this.pageView.node.height;
- let PageWidth = this.pageView.node.width;
- let offsetPos = this.pageView.getScrollOffset();
- let currPageIdx = sender.getCurrentPageIndex();
- let newPageIdx = currPageIdx;
- let offset = 0;
- if (offsetPos.x != 0) {
- // 横向
- offset = currPageIdx * PageWidth + offsetPos.x;
- } else {
- // 纵向
- offset = currPageIdx * pageHeight - offsetPos.y;
- }
- newPageIdx;
- if (offset > 0) {
- newPageIdx -= 1;
- }
- if (offset < 0) {
- newPageIdx += 1;
- }
- if (!this.hasPageContentByIdx(currPageIdx)) {
- this.reloadPageByIdx(currPageIdx);
- }
- // if (!this.hasPageContentByIdx(newPageIdx)) {
- // this.reloadPageByIdx(newPageIdx);
- // }
- },
- handlePageScrollEnded (sender) {
- let idx = sender.getCurrentPageIndex();
- this.removeOtherPagesContent(idx);
- },
- handlePageTurning (sender) {
- if (this.cb) {
- let idx = sender.getCurrentPageIndex();
- this.cb('pageTurnDone', idx);
- }
- },
- getPageByIdx (idx) {
- let pages = this.pageView.getPages();
- for (const page of pages) {
- if (page.name == idx) {
- return page;
- }
- }
- return undefined;
- },
- hasPageContentByIdx (idx) {
- let page = this.getPageByIdx(idx);
- if (page && page.childrenCount > 0) {
- return true;
- }
- return false;
- },
- removeOtherPagesContent (currIdx) {
- let pages = this.pageView.getPages();
- for (const page of pages) {
- if (page.name != currIdx) {
- page.removeAllChildren();
- }
- }
- }
- });
|