功能描述:一個滾動清單,當清單可視區域上部有内容時則上部出現向上箭頭提示,當清單可視區域下部有内容則下部出現向下箭頭提示。
功能實作:應用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
主要是把viewRect_也轉化為世界坐标再進行區域互動判斷即可,望對有同樣問題的同胞有所幫助