PagingEnabled для нескольких страниц в UIScrollView - PullRequest
0 голосов
/ 05 июля 2011

Редактировать: см. Ответ ниже.

Я наконец сдался и пришел сюда, чтобы спросить вас о моей проблеме ...

Я использую UIScrollView для скроллинговых меню с небольшимиконки.На каждой странице с включенной подкачкой есть значок в центре и 2 с половиной других видимых значка слева и справа.Я могу перейти от одного значка к соседнему, и это нормально, но дело в том, что если я сделаю быструю прокрутку, он не будет перемещаться из более чем трех значков, что составляет ширину экрана.

Я хотел бы иметь возможность прокручивать более 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; } } }

1 Ответ

0 голосов
/ 08 июля 2011

Наконец-то я нашел решение, которое было довольно очевидным, но которого я не видел в начале, используя setContentOffset в scrollView.

Вот новая функция обновления:

-(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, он больше не будет работать.Он всегда входит в эту функцию обновления, но 7 раз из 8 он просто блокирует scrollView как есть и не перетаскивает его обратно в положение, которое я ему даю ... но иногда это так.

У кого-нибудь есть идея?Я нашел подобные проблемы в сети, но ни один из них не мог решить эту проблему ...

...