Cocos2dx-Lua UIScrollView 和 UITableView 對比

 

爲何寫這個性能優化


 

  

      上面這個問題的答案也是我寫這篇文章的初衷,在最近給遊戲添加一些列表的時候,對比着應用了一下他們兩個,在它們兩個之間的優劣勢之間進行取捨,就有了這個問題的答案。性能

      按照我一個iOS開發而言,他們倆之間交集就是 UITableView是UIScrollView 的子類,也就是說UITableView是在UIScrollView的基礎上寫的,在平時的應用中 UITableView或者是UICollectionView應用確定比UIScrollView要多,要強大! 學習

      可是在Cocos中,UITableView的性能真的好低!這是我這兩天使用它以後惟一的感覺!  而且它的優化方案很差找,我找了一會,沒找到合適的一個優化方案,這和咱們iOS或者Android就不同了,Android哪怕是性能不高的ListView在通過性能優化以後仍是能夠的,這個Cocos的UITableView有什麼還的優化方案但願大神能指導一下,供你們參考學習一下!優化

      因此,因爲UITableView的性能低,在寫一些列表的時候不得以使用UIScrollView + View 的方式,直接看可能以爲比較愚蠢,但事實是在使用中滑動的流暢度要比UITableView好,很尷尬!ui

 

 

 

 

UITableView你怎麼用的spa


 

      其實要是隻是討論它們的使用的話真的也挺簡單的,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)

 

      下面是它們這些方法的實現,具體的這些方法都是用來幹什麼的咱們就不詳細說了,相信你們都懂!code

--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你怎麼用的blog


 

      那一樣是這個界面咱們要使用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 比較好一點!爲何這麼說呢?

      一、TableView有cell的複用問題,這個固然也能夠解決,在iOS中也是同樣的,這個你得清楚怎麼解決

      二、滑動起來TableView會更加的卡頓! 我本身的嘗試結果是掉針比之前更嚴重呢!

      上面這些內容就是關於這個要談論的內容!

相關文章
相關標籤/搜索