天天看點

quick cocos UIListView之isItemInViewRect方法修正

功能描述:一個滾動清單,當清單可視區域上部有内容時則上部出現向上箭頭提示,當清單可視區域下部有内容則下部出現向下箭頭提示。

功能實作:應用cocos studio1.6制作界面,上面放置一個背景,一個滾動清單,然後程式加載解析這個界面的json檔案,應用quick3.3final下的UIListView的方法isItemInViewRect進行檢測第一條與最後一條是否在可視區域内。

問題:當界面加載進來,坐标設定0,0時,isItemInViewRect方法判斷都沒問題,但當把界面調整位置時,isItemInViewRect方法就不能準确判斷某一條目是否在清單可視區域内了

問題解決:究其原因,發現isItemInViewRect方法現實如下

function UIListView:isItemInViewRect(pos)
	local item
	if "number" == type(pos) then
		item = self.items_[pos]
	elseif "userdata" == type(pos) then
		item = pos
	end

	if not item then
		return
	end
	
	local bound = item:getBoundingBox()
	local nodePoint = self.container:convertToWorldSpace(
		cc.p(bound.x, bound.y))
	bound.x = nodePoint.x
	bound.y = nodePoint.y

	return cc.rectIntersectsRect(self.viewRect_, bound)
end
           

從實作看,首先把清單條目item轉化為世界坐标,然後再判斷清單可視區域viewRect_是否包含條目矩形區域,由此問題來了,清單條目被轉化為了世界坐标,但清單可視區域viewRect_的坐标并沒有轉化為世界坐标系,這就肯定會出問題,不知道quick這樣設計的初衷是什麼,現把該方法修正如下:

function UIListView:isItemInViewRect(pos)
	local item
	if "number" == type(pos) then
		item = self.items_[pos]
	elseif "userdata" == type(pos) then
		item = pos
	end

	if not item then
		return
	end
	
	local bound = item:getBoundingBox()
	local nodePoint = self.container:convertToWorldSpace(
		cc.p(bound.x, bound.y))
	bound.x = nodePoint.x
	bound.y = nodePoint.y
    
    local viewRectPos = self:convertToWorldSpace(cc.p(self.viewRect_.x,self.viewRect_.y))
    local viewRect = cc.rect(viewRectPos.x,viewRectPos.y,self.viewRect_.width,self.viewRect_.height)
    
    return cc.rectIntersectsRect(viewRect, bound)
end
           
quick cocos UIListView之isItemInViewRect方法修正

主要是把viewRect_也轉化為世界坐标再進行區域互動判斷即可,望對有同樣問題的同胞有所幫助