GVKun编程网logo

objective-c – 使用cocos2d的UITableView(cocos2dx ui)

8

在本文中,我们将给您介绍关于objective-c–使用cocos2d的UITableView的详细内容,并且为您解答cocos2dxui的相关问题,此外,我们还将为您提供关于cocos2d-ipho

在本文中,我们将给您介绍关于objective-c – 使用cocos2d的UITableView的详细内容,并且为您解答cocos2dx ui的相关问题,此外,我们还将为您提供关于cocos2d-iphone – 带有cocos2d 3.0的CCTableView、Cocos2d-X 使用CCTableView创建滚动视图、Cocos2dx-Lua UIScrollView 和 UITableView 对比、ios – Objective-C:如何将文档目录中的文件列入UITableView?的知识。

本文目录一览:

objective-c – 使用cocos2d的UITableView(cocos2dx ui)

objective-c – 使用cocos2d的UITableView(cocos2dx ui)

我是Objective-C领域的学习者.我正在尝试用cocos2d构建一个iPhone应用程序.现在我想使用UITableView来显示 XML文件中的数据.

是否可以将UITableView与cocos2d一起使用,是否也可以从XML文件中检索数据?

解决方法

您可以通过使用由某人制作并在 cocos2d forum上发布的CCUIViewWrapper类非常容易地将UIViews与cocos2d场景集成.我曾经使用它并且使用论坛上的所有内容非常简单.

对于XML解析,如果你使用iOS提供的解析器会更好,因为Jonathan说cocos2d是一个游戏引擎,它不提供任何解析XML文件的机制.

cocos2d-iphone – 带有cocos2d 3.0的CCTableView

cocos2d-iphone – 带有cocos2d 3.0的CCTableView

我想让CCTableView使用cocos2d 3.0,但我真的不知道从哪里开始.有没有人有一个很好的教程或3.0的任何东西?我看到有一些旧版本的cocos2d但没有3.0版本.任何帮助表示赞赏!谢谢!

解决方法

这是一个简短的样本.我建议你自己尝试编写一些代码,然后发布你遇到的问题.它绝对可以让您更轻松地回答问题.如果需要,您还可以创建自己的CCTableViewCell子类.

头文件,SampleTableView.h

#import "cocos2d.h"
#import "cocos2d-ui.h"

@interface SampleTableView : CCNode <CCTableViewDataSource>
@end

源文件:SampleTableView.m

float const kNumberOfRows = 30.0f;

@implementation SampleTableView

- (instancetype)init
{
    self = [super init];
    if (self) {
        CCTableView* table = [CCTableView node];
        table.dataSource = self; // make our class the data source
        table.block = ^(CCTableView* table) {
            NSLog(@"Cell %d was pressed",(int) table.selectedRow);
        };
        [self addChild:table];
    }
    return self;
}

- (CCTableViewCell*) tableView:(CCTableView*)tableView nodeForRowAtIndex:(NSUInteger) index {
    CCTableViewCell* cell = [CCTableViewCell node];
    cell.contentSizeType = CCSizeTypeMake(CCSizeUnitnormalized,CCSizeUnitUIPoints);
    cell.contentSize = CGSizeMake(1.0f,32.0f);
    float colorFactor = (index / kNumberOfRows);
    // Just a sample node that changes color with each index value
    CCNodeColor* colorNode = [CCNodeColor nodeWithColor:[CCColor colorWithRed:colorFactor green:(1.0f - colorFactor) blue:(0.2f + 0.5 * colorFactor) ] width:100.0f height:18.0f];
    [cell addChild:colorNode];
    return cell;
}

- (NSUInteger) tableViewNumberOfRows:(CCTableView*) tableView {
    return kNumberOfRows; // just a demo
}

以及如何在你好的世界场景或其他地方添加它:

SampleTableView* table = [SampleTableView node];
table.contentSizeType = CCSizeTypenormalized;
table.contentSize = CGSizeMake(1.0,1.0);

以下是它的样子截图:

Cocos2d-X 使用CCTableView创建滚动视图

Cocos2d-X 使用CCTableView创建滚动视图

From: http://www.jb51.cc/article/p-qawzrdvk-za.html

CCTableView和CCScrollView一样用于创建滚动视图,CCTableView的功能也比较多,创建比较麻烦


实例1:使用CCTableView创建滚动视图

首先创建一个TableView类

TableView.h中的代码

[cpp] view plain copy
  • #ifndef__TableView_H__
  • #define__TableView_H__
  • #include"cocos2d.h"
  • #include"cocos-ext.h"
  • USING_NS_CC;
  • USING_NS_CC_EXT;
  • classTableView:publiccclayer,publicCCTableViewDataSource,publicCCTableViewDelegate
  • {
  • public:
  • virtualboolinit();
  • staticCCScene*scene();
  • CREATE_FUNC(TableView);
  • //创建一个数组
  • CCArray*_arr;
  • //返回格子的大小
  • virtualCCSizetableCellSizeforIndex(CCTableView*table,unsignedintidx)
  • {
  • returncellSizeforTable(table);
  • };
  • //每个格子的大小
  • virtualCCSizecellSizeforTable(CCTableView*table)
  • {
  • //返回窗口的大小
  • returnCCDirector::sharedDirector()->getWinSize();
  • }
  • //返回格子的编号
  • virtualCCTableViewCell*tableCellAtIndex(CCTableView*table,unsignedintidx)
  • {
  • return(CCTableViewCell*)_arr->objectAtIndex(idx);
  • }
  • //返回滚动的大小(格子的个数)
  • virtualunsignedintnumberOfCellsInTableView(CCTableView*table)
  • {
  • return_arr->count();
  • }
  • virtualvoidtableCellTouched(CCTableView*table,CCTableViewCell*cell)
  • {
  • cclog("clickedcellis%d",cell->getIdx());
  • }
  • virtualvoidscrollViewDidScroll(CCScrollView*view){};
  • virtualvoidscrollViewDidZoom(CCScrollView*view){};
  • };
  • #endif//__TableView_H__

  • TableView.cpp中的代码

    [cpp] view plain copy
  • #include"TableView.h"
  • CCScene*TableView::scene()
  • {
  • CCScene*scene=CCScene::create();
  • TableView*layer=TableView::create();
  • scene->addChild(layer);
  • returnscene;
  • }
  • boolTableView::init()
  • {
  • cclayer::init();
  • CCSizewinSize=CCDirector::sharedDirector()->getWinSize();
  • CCPointcenter=ccp(winSize.width/2,winSize.height/2);
  • //先创建好CCTableViewCell
  • //创建一个数组
  • _arr=CCArray::create();
  • _arr->retain();
  • for(inti=0;i<5;i++)
  • {
  • CCTableViewCell*cell=newCCTableViewCell();
  • cell->autorelease();
  • _arr->addobject(cell);
  • CCSprite*sprite=CCSprite::create("HelloWorld.png");
  • cell->addChild(sprite);
  • sprite->setPosition(center);
  • }
  • //创建TableView
  • CCTableView*tableView=CCTableView::create(this,winSize);
  • addChild(tableView);
  • //设置TableView的滚动方向
  • //kCCScrollViewDirectionHorizonta表示在水平方向上滚动
  • tableView->setDirection(kCCScrollViewDirectionHorizontal);
  • //加载数据
  • tableView->reloadData();
  • tableView->setDelegate(this);
  • returntrue;
  • }

  • 执行结果:



    实例2:使用CCTableView创建一个小窗口的滚动视图(该功能常用于游戏中的选择道具)

    首先创建一个TableViewSmall类

    TableViewSmall.h中的代码

    [cpp] view plain copy
  • #ifndef__TableViewSmall_H__
  • #define__TableViewSmall_H__
  • #include"cocos2d.h"
  • #include"cocos-ext.h"
  • USING_NS_CC;
  • USING_NS_CC_EXT;
  • classTableViewSmall:publiccclayer,publicCCTableViewDelegate
  • {
  • public:
  • virtualboolinit();
  • staticCCScene*scene();
  • CREATE_FUNC(TableViewSmall);
  • //创建一个数组
  • CCArray*_arr;
  • //返回格子的大小
  • virtualCCSizetableCellSizeforIndex(CCTableView*table,unsignedintidx)
  • {
  • if(1==idx)
  • {
  • returnCCSizeMake(60,40);
  • }
  • returncellSizeforTable(table);
  • };
  • //每个格子的大小
  • virtualCCSizecellSizeforTable(CCTableView*table)
  • {
  • //每个格子的大小
  • returnCCSizeMake(40,40);
  • }
  • //返回格子的编号
  • virtualCCTableViewCell*tableCellAtIndex(CCTableView*table,unsignedintidx)
  • {
  • return(CCTableViewCell*)_arr->objectAtIndex(idx);
  • }
  • //返回滚动的大小(格子的个数)
  • virtualunsignedintnumberOfCellsInTableView(CCTableView*table)
  • {
  • return_arr->count();
  • }
  • virtualvoidtableCellTouched(CCTableView*table,CCTableViewCell*cell)
  • {
  • cclog("clickedcellis%d",cell->getIdx());
  • }
  • virtualvoidscrollViewDidScroll(CCScrollView*view){};
  • virtualvoidscrollViewDidZoom(CCScrollView*view){};
  • };
  • #endif//__TableViewSmall_H__

  • TableViewSmall.cpp中的代码

    [cpp] view plain copy
  • #include"TableViewSmall.h"
  • CCScene*TableViewSmall::scene()
  • {
  • CCScene*scene=CCScene::create();
  • TableViewSmall*layer=TableViewSmall::create();
  • scene->addChild(layer);
  • returnscene;
  • }
  • boolTableViewSmall::init()
  • {
  • cclayer::init();
  • CCSizewinSize=CCDirector::sharedDirector()->getWinSize();
  • CCPointcenter=ccp(winSize.width/2,winSize.height/2);
  • //先创建好CCTableViewCell
  • //创建一个数组
  • _arr=CCArray::create();
  • _arr->retain();
  • for(inti=0;i<5;i++)
  • {
  • CCTableViewCell*cell=newCCTableViewCell();
  • cell->autorelease();
  • _arr->addobject(cell);
  • CCSprite*sprite=CCSprite::create("Closenormal.png");
  • cell->addChild(sprite);
  • sprite->setPosition(ccp(20,20));
  • }
  • //创建TableView
  • CCTableView*tableView=CCTableView::create(this,CCSizeMake(40*3,40));
  • addChild(tableView);
  • //设置TableView的滚动方向
  • //kCCScrollViewDirectionHorizonta表示在水平方向上滚动
  • tableView->setDirection(kCCScrollViewDirectionHorizontal);
  • //加载数据
  • tableView->reloadData();
  • tableView->setDelegate(this);
  • tableView->setPosition(center);
  • returntrue;
  • }

  • 执行结果:

    Cocos2dx-Lua UIScrollView 和 UITableView 对比

    Cocos2dx-Lua UIScrollView 和 UITableView 对比

     

    为什么写这个


     

      

          上面这个问题的答案也是我写这篇文章的初衷,在最近给游戏添加一些列表的时候,对比着应用了一下他们两个,在它们两个之间的优劣势之间进行取舍,就有了这个问题的答案。

          按照我一个 iOS 开发而言,他们俩之间交集就是 UITableView 是 UIScrollView 的子类,也就是说 UITableView 是在 UIScrollView 的基础上写的,在平时的应用中 UITableView 或者是 UICollectionView 应用肯定比 UIScrollView 要多,要强大! 

          但是在 Cocos 中,UITableView 的性能真的好低!这是我这两天使用它之后唯一的感受!  并且它的优化方案不好找,我找了一会,没找到合适的一个优化方案,这和我们 iOS 或者 Android 就不一样了,Android 哪怕是性能不高的 ListView 在经过性能优化之后还是可以的,这个 Cocos 的 UITableView 有什么还的优化方案希望大神能指导一下,供大家参考学习一下!

          所以,由于 UITableView 的性能低,在写一些列表的时候不得以使用 UIScrollView + View 的方式,直接看可能觉得比较愚蠢,但事实是在使用中滑动的流畅度要比 UITableView 好,很尴尬!

     

     

     

     

    UITableView 你怎么用的


     

          其实要是只是讨论它们的使用的话真的也挺简单的,UITableView 你只需要记得一句话   -- 先注册,在使用  是的就是在说我们平常说的代理方法,不管是返回行列数的,还是设置 cell 的,或者点击等等等等,都是需要我们先注册这个方法,在使用的,大概我们看看下面的代码:

    self._listView = cc.TableView:create(cc.size(744, 367))
    self._listView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)    
    self._listView:setPosition(cc.p(0,0))
    self._listView:setDelegate()
    self._listView:addTo(csbNode)
    
    self._listView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
    self._listView:registerScriptHandler(handler(self,self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX)
    self._listView:registerScriptHandler(handler(self,self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX)
    self._listView:registerScriptHandler(handler(self,self.numberOfCellsInTableView), cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
    self._listView:registerScriptHandler(handler(self,self.tableCellTouched), cc.TABLECELL_TOUCHED)

     

          下面是它们这些方法的实现,具体的这些方法都是用来干什么的我们就不详细说了,相信大家都懂!

    --cell视图大小
    function BankRecordLayer:cellSizeForTable(view, idx)
          return width ,height
    end
    
    --cell视图数目
    function BankRecordLayer:numberOfCellsInTableView(view)
    
        return count
    end
        
    --获取cell
    function BankRecordLayer:tableCellAtIndex(view, idx)
    
        local cell = view:dequeueCell()    
        return cell
    end
    
    --点击cell
    function BankRecordLayer:tableCellTouched(view, cell)
    
        local cell = view:dequeueCell()    
        return cell
    end

     

     

    UIScrollView 你怎么用的


     

          那同样是这个界面我们要使用 UIScrollView 该怎么实现呢?

          其实大致的思路很简单,就是你给你创建的 ScrollView 上面按照你给的位置一个个的添加 View,其实这样也比较简单,重点是我们有几个细节问题需要我们处理好:

    function EmailRecordLayer:CreatEmailItem()
        
        self._emalRecordListCell = {}
        local count = #self._emalRecordList
        self._listView:setInnerContainerSize(cc.size(735,90*count+10))
        for i=1,count do
        	local itemView = EmailItemLayer:create(self,self._emalRecordList[i])
            itemView:setPosition(5,self._listView:getInnerContainerSize().height-90*(i-1)-10)
            itemView:addTo(self._listView)
            table.insert(self._emalRecordListCell,itemView)
        end 
    end

     

          下面这个方法是一个完成的给 ScrollView 上面添加 View 的方法,应该能注意到我们再给 ScrollView 添加 View 的时候,他就是从底部开始添加的,这个我试过改变他们的锚点,但都是无济于事! 

          这样当我们需要从上往下显示 View 的时候就只能倒着去设置它的位置了,这是需要注意的第一点!

          第二点就是滑动范围的问题,这里有两点的确需要我们注意一下: setContentSize 和 setInnerContainerSize 这两个方法需要我们区分清楚!!这点区分清楚就能设置好滑动范围!

          最后还有一点就是点击事件的问题  view 要是能点击就会吞噬滑动事件!设置它不吞噬事件之后不就行了!ennnnn 还有一点: 你按住一个 View 滑动,滑动结束的时候松开 View, 这个时候就会无意间触发点击事件的!这个怎么处理?

          针对上面这个问题,看下面的代码:

     

    local startY, endY
        local btcallback = function(sender, eventType)
            if eventType == ccui.TouchEventType.began then
                startY = sender:getTouchBeganPosition().y
            elseif eventType == ccui.TouchEventType.ended then
                endY = sender:getTouchEndPosition().y
                if math.abs(startY-endY) < 10 then
                    self:onButtonClickedEvent(sender,self.img_red,item)
                end
            end
        end
        img_bg:setSwallowTouches(false)  --不要吞噬事件
        img_bg:addTouchEventListener(btcallback)

     

    那选哪个? 


     

          按照我自己的使用的经验!

          要是你只是需要一个列表,不需要对列表进行其他的操作,这两个都是比较简单也是比较合适的,只不过 TableView 的滑动性能有一点底,让你看着滑动的时候会感觉不流畅!

          但要是你在列表的列上面有大量的操作的时候,还是建议使用 ScrollView + View 比较好一点!为什么这么说呢?

          1、TableView 有 cell 的复用问题,这个当然也可以解决,在 iOS 中也是一样的,这个你得清楚怎么解决

          2、滑动起来 TableView 会更加的卡顿! 我自己的尝试结果是掉针比以前更严重呢!

          上面这些内容就是关于这个要谈论的内容!

          

    ios – Objective-C:如何将文档目录中的文件列入UITableView?

    ios – Objective-C:如何将文档目录中的文件列入UITableView?

    下面我有一些代码将文档目录中的文件列入UITableView.但是,代码没有正常工作,一旦我在我的设备上测试,即使文档目录中有文件,也没有列出所有显示只显示一些空白单元格的内容.这是我目前使用的代码:

    NSArray *filePathsArray;
    
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return [filePathsArray count];   
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
            if (cell == nil) {
                cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
            }
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
            Nsstring *documentsDirectory = [paths objectAtIndex:0];
            filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
            cell.textLabel.text = [documentsDirectory stringByAppendingPathComponent:[filePathsArray objectAtIndex:indexPath.row]];
            return cell;
        }

    解决方法

    在你的代码中,你正在使用cellForRowAtIndexPath:填充数组,显然

    – (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    在cellForRowAtIndexPath之前调用.因此,您需要在重新加载表视图之前初始化数组的内容.将以下行放在ViewDidLoad或viewWillAppear中:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,YES);
    Nsstring *documentsDirectory = [paths objectAtIndex:0];
    filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];

    你应该像以下一样处理:

    06001

    请注意,当没有文件或加载数据时,我返回1,您可以在该单元格中显示“正在加载数据…”或“找不到记录”之类的消息.确保将该单元的userInteractionEnabled设置为NO,否则如果逻辑未正确实现,则可能导致不一致.

    关于objective-c – 使用cocos2d的UITableViewcocos2dx ui的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于cocos2d-iphone – 带有cocos2d 3.0的CCTableView、Cocos2d-X 使用CCTableView创建滚动视图、Cocos2dx-Lua UIScrollView 和 UITableView 对比、ios – Objective-C:如何将文档目录中的文件列入UITableView?等相关知识的信息别忘了在本站进行查找喔。

    本文标签: