PagingEnabled在UIScrollView中的多个页面

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

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

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

我想要的是能够滚动超过3个图标,并且磁铁行为只有在放缓时才被触发。

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

这是我的更新function(如果可以的话):

-(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; } } }

我终于find了一个很明显的解决scheme,但是在开始时我没有看到使用scrollView上的setContentOffset。

这是新的更新function:

 -(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"); } } 

它几乎可以工作,至less在模拟器上。 但只要我尝试在我的iPhone 4上,它不再工作。 它总是进入该更新函数,但在8之间的7次,它只是阻止了scrollView,并没有拖回到我给它的位置…但有时它确实。

会有人有一个想法? 我在网上发现了类似的问题,但他们都不能解决这个问题。