Cocos2d-x3.1中的TableView的使用

1、首先看TableView的头文件

#include "cocos2d.h"
#include "extensions/cocos-ext.h"//包含TableView的头文件
#include "ItemAdapter.h"//适配类
USING_NS_CC;
//事件回调函数
typedef std::function<void(Ref*,cocos2d::ui::Widget::TouchEventType)> menuCallBack;
//继承类
class MenuTableView : public cocos2d::Layer, public cocos2d::extension::TableViewDataSource, public cocos2d::extension::TableViewDelegate
{
public:
    CREATE_FUNC(MenuTableView);
    virtual bool init();

    virtual void scrollViewDidScroll(cocos2d::extension::ScrollView* view) {};//滑动
    virtual void scrollViewDidZoom(cocos2d::extension::ScrollView* view) {};  //放大
    virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell);//触摸事件
    virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx);//Cell大小
    virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx);//添加Cell
    virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table);//设置Cell个数

    void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);//触摸事件

    void addMenuTouchEvent(const menuCallBack& callback);//回调函数

    Size winSize;
    cocos2d::Ref* _pSender;
    cocos2d::ui::Widget::TouchEventType _type;
    menuCallBack _menuCallBack;

    std::vector<std::string> item;
    std::vector<std::string> itemIcon;
};
#include "MenuTableView.h"
#include "ui/CocosGUI.h"
#include "HomeLayer.h"

USING_NS_CC;
USING_NS_CC_EXT;//包含cocos-ext.h头文件的声明
using namespace ui;

bool MenuTableView::init()
{
    bool bRet = false;
    do {
        CC_BREAK_IF(!Layer::init());
        log("MenuTableView");
        //item must be defined first//设置Item名称和背景
        item.push_back("进度");
        item.push_back("同比");
        item.push_back("环比");
        item.push_back("产品线");
        item.push_back("排名");

        itemIcon.push_back("home_list_bg_jindu.png");
        itemIcon.push_back("home_list_bg_tongbi.png");
        itemIcon.push_back("home_list_bg_huanbi.png");
        itemIcon.push_back("home_list_bg_chanpinxian-.png");
        itemIcon.push_back("home_list_bg_paiming-.png");

        winSize = Director::getInstance()->getWinSize();
        //创建TableView对象
        TableView* tableView = TableView::create(this,Size(winSize.width,winSize.height*6/7));
        tableView->setDirection(cocos2d::extension::ScrollView::Direction::VERTICAL);//设置TableView方向
        tableView->ignoreAnchorPointForPosition(false);
        tableView->setAnchorPoint(Vec2::ZERO);//设置锚点
        tableView->setPosition(Vec2::ZERO);//设置位置
        tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);//设置TableView的属性

        tableView->setDelegate(this);//设置委托
        this->addChild(tableView);
        tableView->reloadData();//更新数据
        this->setTouchEnabled(true);//可触摸

        bRet = true;
    }while(0);
    return bRet;
}
//Item触摸事件
void MenuTableView::tableCellTouched(cocos2d::extension::TableView *table, cocos2d::extension::TableViewCell *cell)
{
    log("cell touched at index %zd", cell->getIdx());
}
//设置Cell大小
Size MenuTableView::tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx)
{
    return Size(winSize.width,winSize.height/6);
}
//添加Cell
TableViewCell* MenuTableView::tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx)
{
    TableViewCell* cell = table->dequeueCell();
    if(!cell)
    {
        cell = new TableViewCell();
        cell->autorelease();
    }
    cell->removeAllChildrenWithCleanup(true);
    log("idx = %zd",idx);

    auto menu = ItemAdapter::create();//适配类
    menu->itemIcon->loadTexture(itemIcon.at(idx));//添加Icon
    menu->itemName->setString(item.at(idx));//添加Text
    menu->touchBtn->setTag(10+idx);

    menu->setContentSize(Size(winSize.width,winSize.height/8));//设置视图大小
    log("menu.width = %lf,menu.height = %lf",menu->getContentSize().width,menu->getContentSize().height);

    menu->setSize(Size(winSize.width,winSize.height/8));//设置大小
    menu->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE);//设置布局类型
    menu->ignoreAnchorPointForPosition(false);
    menu->setAnchorPoint(Vec2::ZERO);//设置锚点
    menu->touchBtn->addTouchEventListener(CC_CALLBACK_2(MenuTableView::touchEvent, this));//设置Item触摸事件

    cell->addChild(menu);

    return cell;
}
//设置Cell个数
ssize_t MenuTableView::numberOfCellsInTableView(cocos2d::extension::TableView *table)
{
    return 5;
}
void MenuTableView::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)//回调函数,执行HelloWorld.cpp的touch事件
{
    if(_menuCallBack)
        _menuCallBack(pSender,type);
}
//给_menuCallBack赋值,callback是HelloWorld.cpp中的touchEvent事件
void MenuTableView::addMenuTouchEvent(const menuCallBack &callback)
{
    _menuCallBack = callback;
}

2、工具类:适配

#include "cocos2d.h"
#include "ui/CocosGUI.h"

USING_NS_CC;
using namespace ui;
class ItemAdapter : public Layout
{
public:
    CREATE_FUNC(ItemAdapter);
    virtual bool init();

    void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);

    ui::Text* itemName;
    ui::ImageView* itemIcon;
    ui::ImageView* bgImage;
    ui::Button* touchBtn;
};
#include "ItemAdapter.h"
#include "VisibleRect.h"

bool ItemAdapter::init()
{
    bool bRet = false;
    do {
        CC_BREAK_IF(!Layout::init());

        auto winSize = Director::getInstance()->getWinSize();
        itemIcon = ui::ImageView::create();//Icon
        itemIcon->setScaleY(VisibleRect::getImageScaleY());
        itemIcon->setScaleX(VisibleRect::getImageScale());
        itemIcon->ignoreAnchorPointForPosition(false);
        itemIcon->setAnchorPoint(Vec2(0.5,0.5));
//        itemIcon->setPosition(VisibleRect::center());

        auto rIcon = RelativeLayoutParameter::create();
        rIcon->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT);
        itemIcon->setLayoutParameter(rIcon);
        addChild(itemIcon);

        itemName = ui::Text::create();//Text
        itemName->ignoreAnchorPointForPosition(false);
        itemName->setAnchorPoint(Vec2(0.5,0.5));
        itemName->setFontSize(80 * VisibleRect::getImageScale());
        itemName->setColor(Color3B(128,128,128));

        auto rprogress = RelativeLayoutParameter::create();
        rprogress->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL);
        rprogress->setMargin(Margin(90*VisibleRect::getImageScale(),0,0,0));
        itemName->setLayoutParameter(rprogress);
        addChild(itemName);

        bgImage = ui::ImageView::create("home_list_jiantou.png");
        bgImage->setScaleY(VisibleRect::getImageScaleY());
        bgImage->setScaleX(VisibleRect::getImageScale());
        bgImage->ignoreAnchorPointForPosition(false);
//        into->setTag(PrograssBtn_Tag+i);
        bgImage->setAnchorPoint(Vec2(0.5,0.5));

        auto rinto = RelativeLayoutParameter::create();
        rinto->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL);
        rinto->setMargin(Margin(0,0,90*VisibleRect::getImageScale(),0));
        bgImage->setLayoutParameter(rinto);
        addChild(bgImage,0);

        auto stencil = ui::ImageView::create("home_list_bg_jindu.png");

        touchBtn = Button::create("touming.png");
        log("itemsize.w = %lf,itemsize.h = %lf",stencil->getSize().width,stencil->getSize().height
            );
        log("touchBtn.x = %lf,touchBtn.y = %lf",touchBtn->getSize().width,touchBtn->getSize().height
            );
        auto width = stencil->getSize().width * VisibleRect::getImageScale();
        auto height = stencil->getSize().height * VisibleRect::getImageScaleY();

        touchBtn->setScaleX(width / touchBtn->getSize().width);
        touchBtn->setScaleY(height / touchBtn->getSize().height);
        touchBtn->ignoreAnchorPointForPosition(false);
        //        into->setTag(PrograssBtn_Tag+i);
        touchBtn->setAnchorPoint(Vec2(0.5,0.5));

//        touchBtn->setEnabled(true);

        auto rtouchBtn = RelativeLayoutParameter::create();
        rtouchBtn->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT);
        rtouchBtn->setMargin(Margin(0,0,0,0));
        touchBtn->setLayoutParameter(rtouchBtn);
        addChild(touchBtn,1);

        bRet = true;
    }while(0);
    return bRet;
}

HelloWorld.cpp中添加如下代码

        auto menuTableView = MenuListView::create();
        menuTableView->ignoreAnchorPointForPosition(false);
        menuTableView->setAnchorPoint(Vec2::ZERO);
        menuTableView->setContentSize(Size(winSize.width, winSize.height/7*6));
        menuTableView->setPosition(Vec2::ZERO);
        addChild(menuTableView);

        menuTableView->addMenuTouchEvent(CC_CALLBACK_2(HomeWorld::touchEvent,this));
void HomeLayer::touchEvent(Ref *pSender,cocos2d::ui::Widget::TouchEventType type)
{
    auto* btn = dynamic_cast<ui::ImageView*>( pSender);
    switch (type) {
        case cocos2d::ui::Widget::TouchEventType::ENDED:
        {
            switch (btn->getTag()) {

                case DayReport_Tag:

                {
                    log("1");
                }
                    break;

                case PrograssBtn_Tag:

                {
                    log("2");
                }
                    break;
                case SameBtnCompare_Tag:
                {
<pre name="code" class="cpp">                    log("3");

} break; case RingCompare_Tag: {

                    log("4");

} break; case ProductLine_Tag: {

                    log("5");

} break; default: break; } } break; default: break; }}


时间: 2024-08-29 23:17:56

Cocos2d-x3.1中的TableView的使用的相关文章

Popovercontroller中显示tableView的cell个数

在Popovercontroller中显示tableView,用多少cell,就显示多少cell,去掉多余空白的cell 在控制器中设置 - (void)viewDidLoad{    [super viewDidLoad]; //self.contentSizeForViewInPopover = CGSizeMake(320, 44 * self.menuItems.count);//ios7之前的方法    self.preferredContentSize = CGSizeMake(15

iOS中绑定tableview后,变量值消失的问题

好吧,标题就以最通俗的语句命名,估计百度收录的时候,大家查找的时候会更加的方便. iOS新手,这个问题着实调试了好长时间! 由于上手就开始做大的项目,也没时间从基础做起,相信大多数小公司的开发者都是这种模式.因此很多问题都产生自很基础的错误. 项目使用mvc结构,在异步读取完数据后,NSArray中model的数据就丢失了,专业点就是内存释放了,只剩下内存地址了. 可能大家的情况和我不同,所以解决方法也不一定相同. 项目服务端是asp.net webservice,使用AFNetworking读

cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界

Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入?到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃.(假设用的2.x版本号的cocos2d-x,看前一篇文章box2d) 以下相同以一个小demo来展示一下物理引擎的运用,同一时候说一下我在运用物理引擎中遇到的一些小小的问题. Cocos2d-x 3.0+中的物理属性: 1.物理世界被集成到场景中,当你创建一个场景,你能够

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

IOS学习中的TableView的用法

TableView的用法 TableView是继承ScrollView,在ScrollView还未出现之前,所有的滑动视图都是用TableView来定制的,TableView是必须要实现它自身的两个代理方法的,下面是TableView的一些基本属性和方法的应用 要注意的是(对于所有的ScrollView及其子类来说): 第一次添加到控制器视图上的子视图如果是ScrollView的对象(包含ScrollView子类的对象),则视图的内容偏移量会根据是否有导航栏和标签栏进行扩充 表视图创建时的基本样

iOS解决嵌套在ScrollView中的TableView滑动手势冲突问题

最近在迭代开发公司项目的时候遇到了一个问题,在可以左右切换标签视图的ScrollView中嵌套了两个TableView用于展示视图,感觉一切so easy的情况下,问题出现了,因为左右两个视图既可以实现标签切换,其中TableView还需要侧滑删除功能,那么问题来了,滑动手势懵逼了,这是要搞事情啊!他无法识别到底要做什么处理,因为滑动手势冲突了,下面简单介绍一下解决思路: 大致的项目需求如上图所示: 经过一番资料的查阅,解决办法就是继承自UIScrollView,重写UIScrollView类:

SWIFT中隐藏TableView多余的分隔线

在用TableView是如果数据不能填充满整个屏幕时,数据行下面会有空行及分隔线,这样不是很美观,如下 如何把多余的部分删除掉呢,其它很简单,把TableView的Footer替换为一个空的UIView即可. self.tableView.tableFooterView = UIView() so easy,It looks so nice

点击城市中的tableView跳转到旅游景点

初始化时候的效果图: 点击单元格后的效果图: 项目目录: plist截图: RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> { UITableView * _tableView; NSMutableArray * provinceArray; } @end

IOS中的tableView刷新和加载数据的技巧

WEAK_SELF(vc); [self.tableView addLegendFooterWithRefreshingBlock:^{ vc.pageIndex++; [vc httpRequestWithPageIndex:vc.pageIndex]; }]; [self.tableView addLegendHeaderWithRefreshingBlock:^{ vc.pageIndex = 0; [vc.dataArray removeAllObjects]; [vc httpRequ