【已解决】v2.1.4f版本的UIScrollView不能回弹

贴出i代码,大家帮忙哪里出现的问题。
版本:v2.1.4f(我听说G版本才取消回弹效果,这个版本应该有吧)控件:UIScrollView
代码:
] UILayer uly = UILayer::create();
] uly->setContentSize(ccp(480,320));
] this->addChild(uly,100,100);
]
] UIScrollView usv = UIScrollView::create();
] usv->setBackGroundImage(“scrollviewbg.png”);
] usv->setClippingEnable(true);
] usv->setUpdateEnable(true);
] usv->setPosition(ccp(0,0));
] usv->setTouchEnable(true);
] /
/
] / SCROLLVIEW_DIR_NONE,
] SCROLLVIEW_DIR_VERTICAL,
] SCROLLVIEW_DIR_HORIZONTAL /
] /
/
] usv->setDirection(SCROLLVIEW_DIR_VERTICAL);
] /
/
] / SCROLLVIEW_MOVE_MODE_NONE,
] SCROLLVIEW_MOVE_MODE_NORMAL,
] SCROLLVIEW_MOVE_MODE_ACTION /
] /
***/
*] usv->setMoveMode(SCROLLVIEW_MOVE_MODE_ACTION);
*]
*]
*] usv->setSize(ccp(92,90));
*] uly->addWidget(usv);
*]
*] for (int i =0;i<15;i++)
*] {
] UILabel ulb = UILabel::create();
] ulb->setPosition(ccp(20,90-i25));
*] ulb->setText(“UILABELxxxx”);
*] ulb->setFontName(“黑体”);
*] ulb->setFontSize(24);
*] usv->addChild(ulb);
*] }

复制代码

— Begin quote from ____

%url%工程师 发表于 2013-8-30 10:33
太详细了,太感谢了

— End quote

还在研究,因为我用的是2.1.4h回弹的处理在这个版本上都干掉了.

— Begin quote from ____

%url%小雨 发表于 2013-8-29 18:46
你指的回弹效果是什么啊?是指拉过头了后往回移的效果吗?

如果确实是指这个的话,你又不嫌弃的话可以到C …

— End quote

太详细了,太感谢了:kiss:

  • 本帖最后由 小雨 于 2013-8-29 19:40 编辑 *

— Begin quote from ____

%url%工程师 发表于 2013-8-29 18:38
UIScrollView回弹的问题什么时候能发布啊,急用

— End quote

你指的回弹效果是什么啊?是指拉过头了后往回移的效果吗?

如果确实是指这个的话,你又不嫌弃的话可以到Cocos2dx_v2.1.4fextensionsCocoGUILIBUIWidgetsUIScrollView.cpp里面,把resetPositionWithAction函数换成下面这个,然后再在berthChildren函数的开头加个return;(如果是垂直拉的,内容较少时会靠在上面;水平拉时靠在左边)

void UIScrollView::resetPositionWithAction()
{
    using namespace cocos2d;
    CCPoint delta = CCPointZero;
    UIWidget* child = getCheckPositionChild();
	UIWidget* topChild;
	UIWidget* bottomChild;
	float targetPosition;
	topChild = dynamic_cast<UIWidget*>(m_children->objectAtIndex(0));
	bottomChild = dynamic_cast<UIWidget*>(m_children->lastObject());
    switch (m_eDirection)
    {
        case SCROLLVIEW_DIR_VERTICAL: // vertical
            switch (m_eMoveDirection)
            {
				
                case SCROLLVIEW_MOVE_DIR_UP: // up
					targetPosition = max(m_fBottomBoundary + m_fDisBoundaryToChild_0 + topChild->getRelativeTopPos() - bottomChild->getRelativeBottomPos(), 
										 m_fTopBoundary - m_fDisBoundaryToChild_0); 	
					delta.y = targetPosition - topChild->getRelativeTopPos();
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_DOWN: // down
					targetPosition = m_fTopBoundary - m_fDisBoundaryToChild_0;
                    delta.y = targetPosition - topChild->getRelativeTopPos();
					break;

                default:
                    break;
            }
            break;
        case SCROLLVIEW_DIR_HORIZONTAL: // horizontal
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_LEFT: // left
					targetPosition = min(m_fLeftBoundary + m_fDisBoundaryToChild_0,
										 m_fRightBoundary - m_fDisBoundaryToChild_0 + topChild->getRelativeLeftPos() - bottomChild->getRelativeRightPos());
                    delta.x = targetPosition - topChild->getRelativeLeftPos();
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_RIGHT: // right
					targetPosition = m_fLeftBoundary + m_fDisBoundaryToChild_0;
                    delta.x = targetPosition - topChild->getRelativeLeftPos(); 
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
    
//    int times = m_children->count();
    ccArray* arrayChildren = m_children->data;
    int times = arrayChildren->num;
    for (int i = 0; i < times - 1; ++i)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(arrayChildren->arr*);
        CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
        CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
        child->runAction(ease);
    }
    
    UIWidget* child_last = dynamic_cast<UIWidget*>(m_children->lastObject());
    CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
    CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
    CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(UIScrollView::handleScrollActionEvent));
    CCSequence* seq = CCSequence::create(ease, callFunc, NULL);
    child_last->runAction(seq);
    
    isRunningAction = true;
}
*垂直移动时,图片要从上往下加;水平移动时,图片要从左往右加。
急用的话可以尝试下这个(我也是急用才自己改的)。不然还是耐心等官方发布吧。

建议楼主不要使用,回弹模式因为存在 bug,所以 g 版之后已经取消了

  • 本帖最后由 小雨 于 2013-8-29 19:40 编辑 *

— Begin quote from ____

%url%工程师 发表于 2013-8-29 18:38
UIScrollView回弹的问题什么时候能发布啊,急用

— End quote

你指的回弹效果是什么啊?是指拉过头了后往回移的效果吗?

如果确实是指这个的话,你又不嫌弃的话可以到Cocos2dx_v2.1.4fextensionsCocoGUILIBUIWidgetsUIScrollView.cpp里面,把resetPositionWithAction函数换成下面这个,然后再在berthChildren函数的开头加个return;(如果是垂直拉的,内容较少时会靠在上面;水平拉时靠在左边)

void UIScrollView::resetPositionWithAction()
{
    using namespace cocos2d;
    CCPoint delta = CCPointZero;
    UIWidget* child = getCheckPositionChild();
	UIWidget* topChild;
	UIWidget* bottomChild;
	float targetPosition;
	topChild = dynamic_cast<UIWidget*>(m_children->objectAtIndex(0));
	bottomChild = dynamic_cast<UIWidget*>(m_children->lastObject());
    switch (m_eDirection)
    {
        case SCROLLVIEW_DIR_VERTICAL: // vertical
            switch (m_eMoveDirection)
            {
				
                case SCROLLVIEW_MOVE_DIR_UP: // up
					targetPosition = max(m_fBottomBoundary + m_fDisBoundaryToChild_0 + topChild->getRelativeTopPos() - bottomChild->getRelativeBottomPos(), 
										 m_fTopBoundary - m_fDisBoundaryToChild_0); 	
					delta.y = targetPosition - topChild->getRelativeTopPos();
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_DOWN: // down
					targetPosition = m_fTopBoundary - m_fDisBoundaryToChild_0;
                    delta.y = targetPosition - topChild->getRelativeTopPos();
					break;

                default:
                    break;
            }
            break;
        case SCROLLVIEW_DIR_HORIZONTAL: // horizontal
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_LEFT: // left
					targetPosition = min(m_fLeftBoundary + m_fDisBoundaryToChild_0,
										 m_fRightBoundary - m_fDisBoundaryToChild_0 + topChild->getRelativeLeftPos() - bottomChild->getRelativeRightPos());
                    delta.x = targetPosition - topChild->getRelativeLeftPos();
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_RIGHT: // right
					targetPosition = m_fLeftBoundary + m_fDisBoundaryToChild_0;
                    delta.x = targetPosition - topChild->getRelativeLeftPos(); 
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
    
//    int times = m_children->count();
    ccArray* arrayChildren = m_children->data;
    int times = arrayChildren->num;
    for (int i = 0; i < times - 1; ++i)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(arrayChildren->arr*);
        CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
        CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
        child->runAction(ease);
    }
    
    UIWidget* child_last = dynamic_cast<UIWidget*>(m_children->lastObject());
    CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
    CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
    CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(UIScrollView::handleScrollActionEvent));
    CCSequence* seq = CCSequence::create(ease, callFunc, NULL);
    child_last->runAction(seq);
    
    isRunningAction = true;
}
*垂直移动时,图片要从上往下加;水平移动时,图片要从左往右加。
急用的话可以尝试下这个(我也是急用才自己改的)。不然还是耐心等官方发布吧。

建议楼主不要使用,回弹模式因为存在 bug,所以 g 版之后已经取消了