参照:cocos2dx / extends / GUI / CCScrollView / CCScrollView.cpp
具体的CCScrollView::minContainerOffset
にはCCScrollView::maxContainerOffset
CCScrollView
OpenGL座標で機能します(ウィンドウ座標ではありません)-値は(左、下)を基準にしており、正のY軸が上に向かっています。また、スクロールビューの位置とコンテナCCNode::setAnchorPoint
は(左、下)に固定されていることに注意してください。
下にスクロールすると(コンテンツを上に移動/プルしてカット/クリップの下のコンテンツを表示)、画面の下端の下にコンテンツが表示されますが、タッチ/ドラッグを離すとすぐに元にmaxContainerOffset
戻り(0, 0)
ます。ポジティブなコンテンツオフセットに移行しようとしました。
この図は、スクロールビューとコンテナが作成/初期化されたときの状態を示しています。これは、子要素とコンテナを設定および配置するときに「考える」状態または座標です。灰色の長方形(左、下)は、コンテナをスクロールするための有効な領域を示しています。コンテナのアンカーポイントがコンテナ内を移動すると想像してください。
コンテナが最初に上にスクロールされていることを確認するには(ウィンドウ座標で作業するときに期待すること)、それに応じてコンテンツオフセットを設定します(設定直後)。これにより、期待される結果/動作が得られます。
scrollView->setContentOffset(ccp(0.f, (scrollViewHeight-scrollContainerHeight)), false);
より完全な例は、以下の編集されたコードにあります。
ウィンドウ座標(正のY軸を下向き)でスクロールできるようにする「修正」は、拡張子を調整することです。これには、cocos2dxライブラリを再構築する必要があり、すべてのプロジェクト(他のサンプルコードでも)に影響します。
/*
// (StackOverflow Post Edit: This hack is not required.)
CCPoint CCScrollView::maxContainerOffset()
{
// Default CCPointZero;
return ccp(0.0f, m_pContainer->getContentSize().height*m_pContainer->getScaleY() - m_tViewSize.height);
}
CCPoint CCScrollView::minContainerOffset()
{
// Default Y = m_tViewSize.height - m_pContainer->getContentSize().height*m_pContainer->getScaleY();
return ccp(m_tViewSize.width - m_pContainer->getContentSize().width*m_pContainer->getScaleX(),
0.f);
}
*/
邪魔にならない ハックは、ScrollViewインスタンスを-1にスケーリングし、コンテナノードの子も-1にスケーリングすることです。また、逆スケールを考慮して子ノードを再配置する必要があります。両方のレベルでのスケーリングの結果、コンテンツ(子ノード)がまっすぐに表示されます(反転されません)。ScrollViewを-1にスケーリングした結果、予想される方向にスクロールが実行されます。ただし、この「修正」はX軸のスクロールも反転するため、垂直方向にスクロールする場合にのみ適しています( )。CCScrollViewDirectionVertical
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCLayer* scrollContainer = CCLayer::create(); // Container for the scroll view
scrollContainer->setAnchorPoint(CCPointZero); // CCScrollView does this too when it's set as the container.
// Content for the container
CCSprite *tallContentA = CCSprite::create("TallContentA.png");
tallContentA ->setPosition(ccp(winSize.width*0.5f, winSize.height*0.9f));
CCSprite *tallContentB = CCSprite::create("TallContentB.png");
tallContentB ->setPosition(ccp(winSize.width*0.5f, winSize.height*0.1f));
scrollContainer->addChild(tallContentA, 2);
scrollContainer->addChild(tallContentB, 2);
float scrollContainerHeight = tallContentA->getContentSize().height + tallContentB->getContentSize().height;
scrollContainer->setPosition(CCPointZero);
scrollContainer->setContentSize(CCSizeMake(winSize.width, scrollContainerHeight*1.05f));
// Set up scroll view
CCScrollView* scrollView = CCScrollView::create(winSize, scrollContainer);
scrollView->setPosition(CCPointZero);
scrollView->setDirection(CCScrollViewDirectionVertical);
// ScrollView initializes at the (left, bottom). The container also gets positioned relative to that and goes Y-up.
// Pre-set it to the value CCScrollView::minContainerOffset will return when it's scrolled to the top
// (note, this is a negative number, indicating the touch moving downwards, i.e. it's pre-scrolled such that the top of the content is visible when we begin)
scrollView->setContentOffset(ccp(0.f, (winSize.height-scrollContainerHeight*1.05f)), false);
/*
// (StackOverflow Post Edit: This hack is not required.)
// Hack: CCScrollView's maxContainerOffset is (0, 0) and minContainerOffset is (difference between view and content size which is negative)
// It's designed to be (left, bottom) based and positive scrolling means showing stuff above the top of the screen.
// Since we're using it in terms of Window coordinates ((left, top) based), we scale the scroll view
// and it's container's children by -1 and position the children differently
// (eg. Y position winSize.height*0.1f was changed to winSize.height*0.9f)
// We can't just set the scroll view's Y scale to -1 because CCNode::getScale asserts that X and Y scale must be the same.
scrollView->setScale(-1.f);
tallContentA->setScale(-1.f);
tallContentB->setScale(-1.f);
*/
addChild(scrollView);
また、上記の2つの修正は相互に排他的であることに注意してください。両方を適用しないでください。
cocos2d-xフォーラムでも今すぐ回答してください。