编辑:请参阅下面的答案。
我终于放弃了,来这里问你我的问题...
我正在使用 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;
}
}
}
我终于找到了一个解决方案,这是非常明显的,但我一开始没有看到,通过在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 次,它只是按原样阻止滚动视图,并且不会将其拖回到我给它的位置......但有时会这样做。
有人有想法吗?我在网上发现了类似的问题,但没有一个能解决这个问题......