zoukankan      html  css  js  c++  java
  • 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会更加的卡顿! 我自己的尝试结果是掉针比以前更严重呢!

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

          

  • 相关阅读:
    angularjs1.6.4中使用ng-table出现data.slice is not a function的问题
    使用sql语句获取数据库表的信息
    IIS部署web,字体404的问题
    SQL中partition关键字的使用
    asp.net 配置二级域名的共享session,并实现sso单点登录
    同一浏览器中同一JavaWeb程序不共享session方法
    Liquibase的使用
    对象并不一定都是在堆上分配内存的
    阿里面试题,为什么wait()方法要放在同步块中?
    粗浅看 Tomcat系统架构分析
  • 原文地址:https://www.cnblogs.com/zhangxiaoxu/p/9875964.html
Copyright © 2011-2022 走看看