關於tableview的旋轉

前提:本文測試用的quick版本爲2.2.1-rc

最近寫一個接口,是關於過關條件的。因爲條件是後臺編輯,長度不固定,所以需要做成可滑動的。採取的措施是將編輯內容打散,分成若干個label,然後將其寫入tableview中。由於某種原因,存放tableview的parentnode是旋轉過的,如果直接將tableview放入,則導致tableview的UI和觸摸範圍不一致。表現爲在指定位置可以接收到觸摸事件,但是UI卻不在此位置。
問題出現的原因是scrollview的裁剪出現問題,可以用setClippingToBounds(false)來進行測試。但是這樣子的話scrollview就失去了原有的特性。解決方法有兩種。1>修改scrollview的裁剪算法。因爲同事做過這個功能,所以我直接借鑑他的代碼。他是這樣處理的,重寫scrollview代碼。首先判斷是否旋轉過,如果旋轉過,則在befrodraw中轉換一下寬度和高度。代碼如下。

else {
            glEnable(GL_SCISSOR_TEST);
            if (!isHDeviceOrientation())
            {
                CCSize winSize = CCDirector::sharedDirector()->getWinSize();
                frame.origin.y = winSize.height-frame.origin.y;
                frame.origin.y = 0;
                CC_SWAP(frame.size.width, frame.size.height, float);
            }
            CCEGLView::sharedOpenGLView()->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
        }

同時修改getViewRect(),添加代碼如下

if (isHDeviceOrientation())
        return CCRectMake(screenPos.x, screenPos.y, m_tViewSize.width*scaleX, m_tViewSize.height*scaleY);

同事用其做了一個牌桌的過關提示,證明是可行的。但是這樣有個劣勢是,需要不斷的調整scrollview的viewsize,position和contentoffset。需要不斷嘗試。2>修改旋轉。tableview有兩種方式,horizontal和vertical。設想一下因爲父節點旋轉,導致tableview的裁剪出問題,問題的原因可以在裁剪上,也可以在旋轉上。如果父節點旋轉,同時tableview也旋轉,讓其總旋轉爲360度,是否就相當於沒有旋轉,這樣裁剪就不會出現問題了。事實證明這樣是可行的。唯一需要注意的是tableview需要旋轉270度,同時如果理想的滑動方式爲垂直,現在需要改動爲左右滑動。tableview沒有旋轉,要營造出旋轉的效果,可以旋轉tableviewcell內的節點。這樣就可以了。

發佈了27 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章