爲何寫這個性能優化
上面這個問題的答案也是我寫這篇文章的初衷,在最近給遊戲添加一些列表的時候,對比着應用了一下他們兩個,在它們兩個之間的優劣勢之間進行取捨,就有了這個問題的答案。性能
按照我一個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會更加的卡頓! 我本身的嘗試結果是掉針比之前更嚴重呢!
上面這些內容就是關於這個要談論的內容!