在 UIScrollView 中为多个页面启用分页

问题描述 投票:0回答:1

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

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

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

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

我尝试安排滚动视图来计算其速度,并在快速移动时将 pagingEnabled 属性设置为 NO,在减速时再次将其设置为 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;
        }
    }
}

ios iphone pagination uiscrollview uikit
1个回答
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 次,它只是按原样阻止滚动视图,并且不会将其拖回到我给它的位置......但有时会这样做。

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

© www.soinside.com 2019 - 2024. All rights reserved.