编辑:请参阅下面的答案。
我终于放弃了来这里问你我的问题......
我正在使用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;
}
}
}
答案 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,并没有将它拖回到我给它的位置......但有时它会这样做。
有人有想法吗?我在网上发现了类似的问题,但没有一个能解决这个问题......