CCScrollView使用的一点点心得

  • 本帖最后由 luckykiddie 于 2013-6-10 21:24 编辑 *

UPDATE:(IMPORTANT)
很久没有更新本文,实在抱歉。
因为之前cocos2dx在某一个版本更新之后,CCScrollView的用法已经人性化很多,和UIScrollView接近,直接明了;而本文的方法已经不适用了,请大家直接忽略.

版本是:cocos2dx-1.0.1-x-0.12.0
之前使用CCScrollView的时候遇到了一点问题,首先API和UIScrollView相差较大,一时还有点儿不习惯,区分不来"frame"和"contentSize"怎么搞。

快速看了下CCScrollView源码,发现其实现里有个m_pContainer的CCLayer,用m_pContainer的大小来控制CCScrollView的可滑动大小,所以在不改动源码的情况下,创建CCScrollView:

CCSize containerSize = CCSizeMake(480, 600);
CCSize scrollViewSize = CCSizeMake(480, 320);

CCNode* pContainer = CCLayer::create();
pContainer->setContentSize(containerSize);
CCScrollView* scrollView = CCScrollView::create(scrollViewSize, pContainer);
addChild(scrollView);
scrollView->setDirection(CCScrollViewDirectionVertical);

此时创建的View是有了,并且也可以滑动了,但是上、下可滑动的距离却颠倒了;手指向上滑,View里的内容只能向下滑动一点,并且手松开就自动返回原位置(回滑);手指向下滑,View的内容可以滑动,并且不回滑。后测试,发现左右方向也一样是反的。

又看了一下源码,做了些改动,原始的代码:









CCPoint CCScrollView::maxContainerOffset()
{
    return ccp(0.0f, 0.0f);
}


CCPoint CCScrollView::minContainerOffset()
{
    return ccp(m_tViewSize.width - m_pContainer->getContentSize().width*m_pContainer->getScaleX(), 
               m_tViewSize.height - m_pContainer->getContentSize().height*m_pContainer->getScaleY());
}

改动之后:

CCPoint CCScrollView::maxContainerOffset()
{
    return ccp(0, m_pContainer->getContentSize().height*m_pContainer->getScaleY() - m_tViewSize.height);
}

CCPoint CCScrollView::minContainerOffset()
{
    return ccp(m_tViewSize.width - m_pContainer->getContentSize().width*m_pContainer->getScaleX(), 0);
}

经测试,view的显示和滑动没有问题了。^_^源码我只看了相关的一部分,有什么不妥的地方,欢迎大家指正。

现在还有些问题没有解决:
1) 滑动优先的问题,如果我在view里放几个CCMenuItem,那么当点到他们的时候会出发CCMenuItem而不会滑动
2)还是CCMenuItem的问题,当一个CCMenuItem滑动出ScrollView的时候,还是可以点击的

更新以上2个问题的解决:http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=3076&extra=page%3D1

支持分享

论坛的编辑功能真是让人蛋痛:L

不错啊,看看先

又学习到新知识了。

:smiley: 谢谢分享

支持~~ 学到东西了!! :slight_smile: