实现CCTableView带滚动条(转)

来源:互联网 发布:阿里云仓 编辑:程序博客网 时间:2024/06/01 23:42

转自:http://blog.sina.com.cn/s/blog_86ce3f9801019dd3.html


使用CCTableView可以实现拖动列表框功能,不过CCTableView没带滚动条,最近项目要求实现带滚动条,不停的尝试,基本可以满足要求了:

创建CCTableView,kCCScrollViewDirectionVertical纵向放置.

1
2
3
4
5
6
7
8
9
CCTableView* tableView = CCTableView::create(this, CCSizeMake(762, 439));
if(tableView != NULL)
{
    tableView->setDirection(kCCScrollViewDirectionVertical);
    tableView->setPosition(ccp(33, 30));
    tableView->setDelegate(this);
    tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    this->addChild(tableView);
}

 

滚动条:

1
2
3
4
5
6
7
8
CCSprite* bar = CCSprite::create("ui/scrollBar.png");
if(bar != NULL)
{
    bar->ignoreAnchorPointForPosition(false);
    bar->setAnchorPoint(ccp(0.5, 1));
    bar->setPosition(ccp(805, 465));
    this->addChild(bar, 1, 1000);
}

 

滚动响应事件tableCellAtIndex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CCTableViewCell* Fjut::tableCellAtIndex(CCTableView* table, unsignedint idx)
{
    CCString* string = CCString::createWithFormat("%d", idx);
   
    CCTableViewCell* cell = table->dequeueCell();
    if(cell == NULL)
    {
        cell =new CCTableViewCell();
        cell->autorelease();
 
        // test
        CCLabelTTF* label_ = CCLabelTTF::create(string->getCString(),"Aril", 15);
        if(label_ != NULL)
        {
            label_->setPosition(ccp(65, 56));
            label_->setColor(FONT_COLOR_Green);
            cell->addChild(label_, 1, 100);
        }
    }
    else
    {
        scrollBar(table);// ...
 
        CCLabelTTF* label_ = (CCLabelTTF*)cell->getChildByTag(100);
        if(label_ != NULL)
        {
            label_->setString(string->getCString());
        }
    }
 
    returncell;
}

 

处理滚动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void Fjut::scrollBar(CCTableView* table)
{
    CCNode* bar =this->getChildByTag(1000);
    if(bar == NULL)
    {
        return;
    }
 
    // tableSize.height == cell个数*cell的height
    CCSize tableSize = table->getContentSize();
    // CCTableView
    CCSize tableViewSize = table->getViewSize();
    // 每次拖动的偏移量?(负值)
    CCPoint contOffsetPos = table->getContentOffset();
 
    // 总的偏移量
    floatmaxOff = tableViewSize.height - tableSize.height;
    // 每次拖动的偏移量
    floatcurOff = contOffsetPos.y - maxOff;
    // 计算百分比
    floatpercentage = fabs(curOff)/fabs(maxOff);
 
    printf("curOff:%f, maxOff:%f, per:%f\n", curOff, maxOff, percentage);
     
    // 拖拉到最顶端或最低端后继续拖动(弹回)会出现percentage值小于0.1和大于1.0的情况,我们分别把percentage重置为0和1.0f
    if(percentage < 0.1f)
    {
        percentage = 0;
    }
    if(percentage > 1.0f)
    {
        percentage = 1.0f;
    }
 
    // bar移动到最顶端的position.y
    floatbarTopPosY = bar->getPosition().y;
    // bar移动到最低端的position.y
    floatbarLowPosY = 75.0f;
    // ....
    floath = barTopPosY - percentage*(barTopPosY- barLowPosY);;
 
    bar->setPosition(ccp(bar->getPosition().x, h));
}

 

当然,滚动条的长度要根据numberOfCellsInTableView中的cell个数进行缩放。相应的barLowPosY 也跟着变化。

如图:

QQ截图20130527215403

收工.