PagingEnabled用于UIScrollView中的多个页面

时间:2011-07-05 09:30:05

标签: iphone ios uikit uiscrollview paging

编辑:请参阅下面的答案。

我终于放弃了来这里问你我的问题......

我正在使用UIScrollView来显示带有小图标的滚动菜单。 在每个页面上,启用分页后,中间会出现一个图标,左侧和右侧有两个半可见的图标。我可以从一个图标移动到它的邻居,这很好,但关键是如果我进行快速滚动,它将不会从超过3个图标移动,这是屏幕的宽度。

我想要的是能够滚动超过3个图标,磁铁行为仅在减速时触发。

我已经尝试安排滚动视图来计算它的速度,并在快速移动时将pagingEnabled属性设置为NO,当它减慢时再将YES设置为YES,但是一旦设置为YES,视图就会返回它原来的位置非常快,好像它没有检测到我把它带到了新的页面。有谁知道为什么会这样做?如果我有办法告诉视图“好的,现在分页已启用,但看起来,你是15页后。只是在当前页面的中心,不要在开头回来。”

这是我的更新功能(如果可以提供帮助):

-(void)update:(ccTime)dt { float velocity = fabsf((self.previousOffset-self.scrollView.contentOffset.y)/dt); self.previousOffset = self.scrollView.contentOffset.y; CCLOG(@"Velocity: %f", velocity); if(self.scrollView.pagingEnabled) { if(velocity > 100) { self.scrollView.pagingEnabled = NO; } } else { if(velocity < 100) { self.scrollView.pagingEnabled = YES; } } }

1 个答案:

答案 0 :(得分:0)

我终于找到了一个非常明显的解决方案,但是我在开头没有看到,通过在scrollView上使用setContentOffset。

这是新的更新功能:

-(void)update:(ccTime)dt

{

    float velocity = 1000;
    if(self.previousOffset)
    {
        velocity = fabsf((self.previousOffset-self.scrollView.contentOffset.y)/dt);
    }
    self.previousOffset = self.scrollView.contentOffset.y;

    if(velocity < 300)
    {

        CGSize screenSize = [[CCDirector sharedDirector] winSize];
        float halfScreen = screenSize.width/2;
        CCLayer *panel = (CCLayer *)[self getChildByTag:1];
        SQScrollViewMenu *menu = (SQScrollViewMenu *)[panel getChildByTag:1];
        SQMissionItem *currentItem = (SQMissionItem *)[menu getChildByTag:currentPage];

        float contentOffsetY = [self.scrollView contentOffset].y;
        CCLOG(@"Currentpage: %i ; currentoffsetY: %f", currentPage, contentOffsetY);
        float distance = contentOffsetY + [currentItem position].x - halfScreen + panel.position.x + menu.position.x + panel.parent.position.x - 60;
        CCLOG(@"Which gives a distance of: %f", distance);

        [self.scrollView setContentOffset:CGPointMake(0, distance) animated:YES];
        self.previousOffset = 0;
        [self unschedule:@selector(update:)];
        CCLOG(@"Is unscheduled");
    }
}

它几乎正在工作......至少,它是在模拟器上。但是一旦我在iPhone 4上试用它,它就不再起作用了。它总是进入更新功能,但在8中有7次,它只是阻挡了scrollView,并没有将它拖回到我给它的位置......但有时它会这样做。

有人有想法吗?我在网上发现了类似的问题,但没有一个能解决这个问题......