SelectiveScrollとは株式会社ONE-UPのエンジニアさんが作ったScrollViewです。
こちらの記事になります     → こちら 
githubにも公開されております → github

どのようなものか説明する文章を引用させてもらうと、
CCScrollViewは動きがかなりチープなので、もっとiOSライクに気持ちよくスクロールできるScrollView
となります。


SelectiveScrollを使えばパズドラのようなモンスターBOXの画面も簡単に作ることができますし、UITableViewみたいな触り心地になるのでかなり便利だと思います。

ただ、使い方が難しい印象を受けました。
というのも、自分の使いやすいような設定をするためにはうまく調整する必要があるためです。

今回はプロジェクトへの追加からサンプルの起動までは省きます。
重要な部分は以下となります。

for (int i = 0; i < count; i++) {
        CCSize size = CCSizeMake(WINSIZE.width / count * 0.7, WINSIZE.height * 0.7);
        SelectiveScroll* scroll = SelectiveScroll::create();
        scroll->setPosition(CCSizeMake(WINSIZE.width / (count + 1) * (i + 1), WINCENTER.y));
        scroll->setBoundingEffectKind((BoundingEffect)i);
        scroll->setContentSize(size);
        scroll->setDelegate(this);
        scroll->clipToBounds(true);
        scroll->retain();
        
        float lastY = 0.0;
        int rowCount = 50;
        for (int ii = 0; ii < rowCount; ii++) {
            CCLabelTTF* label = CCLabelTTF::create("", "Helvetica", 44);
            
            // position
            float margin = 100;
            float y = margin + (label->getScaleY() + margin) * ii;
            label->setPosition(CCPointMake(size.width * 0.5, y));
            scroll->getScrollLayer()->addChild(label);
            
            CCPoint p = label->getPosition();
            string title = to_string(rowCount - ii) + " (" + to_string((int)p.y) + ")";
            label->setString(title.c_str());
            
            lastY = p.y + margin;
        }
        scroll->setScrollSize(CCSizeMake(size.width, lastY));
        scroll->scrollToTop();
        this->addChild(scroll);
}


実行した画面をもとに見ていきます。

selectivescroll



// position
float margin = 100;
float y = margin + (label->getScaleY() + margin) * ii;
label->setPosition(CCPointMake(size.width * 0.5, y));
scroll->getScrollLayer()->addChild(label);


このコードを見ると、marginとyによって貼り付けられているラベルの座標が指定されていることが分かります。yの値はforが回るたびに増加していきますので、どんどんラベルの座標は上昇していきます。ですので、ラベルは一番下から(50から)貼り付けられていることになります。

そして、最後に

lastY = p.y + margin;


とあります。これは以下の画像を見ると分かると思います。

selectivescroll解説



という仕掛けになっているので、lastYの行は一番最後に一度だけ実行すればいいのです。
仕組みが分かったのでいろいろカスタマイズすると以下のようなものも作れました。

popila


しっかりぬるぬる動いてくれるので助かりました。
ただ、メモリに注意してみるとどうやらリークしているようでした。

scroll->retain();

この部分っているのかなーと思い削除してみると、メモリリークしなくなりました。
また、動作も変わりませんでした。