const { ccclass, property } = cc._decorator; /** * 翻页组件类 * - 简单版 无动态加载功能 * - 已知bug,请注意规避:开启回弹后,首尾界面回弹没有考虑 setCurrentPageIndex 导致在setCurrentPageIndex设置之后的位置开始回弹。解决方法:关闭回弹 * @author 薛鸿潇 */ @ccclass export default class PageView extends cc.Component { /** 翻页组件 */ private comp_page_view: cc.PageView = null; /** item 容器 */ private arr_node_item: Array = []; onLoad() { this.comp_page_view = this.node.getComponent(cc.PageView); this.node.on('ui-init', this.init, this);// 初始化列表 this.node.on('ui-clearItem', this.clearItem, this);// 清除页面 this.node.on('ui-backCurPage', this.backCurPage, this);// 返回到当前Index对应的界面【滑动后禁用滑动功能,再打开滑动功能,翻页组件不会自动返回,调用此接口】 } start() { } /** * 初始化列表 * @param list_data 数据列表 * @param page_item item预制体 */ private init(list_data: Array, page_item: cc.Prefab, init_index: number = 0) { const data_count = list_data.length; if (!data_count) { // 刷新时,数据列表是空的 const node_count = this.arr_node_item.length; for (let i = 0; i < node_count; i++) { this.comp_page_view.removePageAtIndex(i); this.arr_node_item.splice(i, 1); } return; } for (let i = 0; i < data_count; i++) { let node_item = this.arr_node_item[i]; if (!node_item) { node_item = cc.instantiate(page_item); this.arr_node_item.push(node_item); } // node_item.parent = this.content; this.comp_page_view.addPage(node_item); node_item.getComponent(node_item.name).setItemData(list_data[i]); } this.comp_page_view.setCurrentPageIndex(init_index); // 清理多出来的item const node_count = this.arr_node_item.length; if (data_count > node_count) { for (let i = data_count; i < node_count; i++) { this.comp_page_view.removePageAtIndex(i); this.arr_node_item.splice(i, 1); } } } /** * 返回当前页 */ private backCurPage() { let index = this.comp_page_view.getCurrentPageIndex(); this.comp_page_view.setCurrentPageIndex(index); } /** 清理子节点 * - need_destroy 销毁 */ private clearItem(need_destroy: boolean = false) { // this.comp_page_view.removeAllPages(); // const n_count = this.arr_node_item.length; // for (let i = 0; i < n_count; i++) { // if (need_destroy) { // let node_end = this.arr_node_item.pop(); // node_end.destroy(); // } else { // this.arr_node_item[i].removeFromParent(); // } // } } // update (dt) {} }