UIScrollView не прокручивается до нужного места с помощью setContentOffset: animated:

У меня есть серия изображений в UIScrollView. Когда пользователь отпускает прокрутку, я хочу, чтобы представление сосредоточилось на одном изображении. Я реализовал код, но основное поведение неверно. Мой вызов setContentOffset: animated: имеет правильные значения, но представление на самом деле не прокручивается до этой точки. Вот результат некоторой отладки:

2011-03-26 17:28:16.201 PivotMachine[39984:207] Dragging Beginning at: 270,   0
2011-03-26 17:28:16.322 PivotMachine[39984:207]     Dragging Ended at: 360,   0 --> 350,   0
2011-03-26 17:28:16.624 PivotMachine[39984:207]    Scrolling Ended at: 350,   0
2011-03-26 17:28:25.648 PivotMachine[39984:207] Dragging Beginning at: 447,   0

Как вы можете видеть, внутренне он думал, что прекратил перетаскивание на 360, поэтому правильно продвинулся до 350, где должно было быть. Визуально вместо этого он сидит около 450, о чем он знает, когда я снова начинаю перетаскивать (да, я знаю, что вы не сразу начинаете, поэтому я очень медленно перетаскиваю, чтобы переместить только пару пикселей до события).

Это код перетаскивания (для моего подкласса UIScrollView):

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint myLocation = self.contentOffset;
    NSLog(@"Dragging Beginning at: %3.0f, %3.0f", myLocation.x, myLocation.y);
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollV
{
    CGPoint myLocation = self.contentOffset;
    NSLog(@"   Scrolling Ended at: %3.0f, %3.0f", myLocation.x, myLocation.y);
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    // Auto-scroll to the center of the closest menu
    if (scrollView != self)
    {
        DLog(@"[ScrollMenu scrollViewWillBeginDecelerating] called with non-self");
        return;
    }
    CGPoint myLocation = self.contentOffset;
    int idx = [self indexOfMenuClosestTo:myLocation];
    CGPoint menuPoint = CGPointMake(menuPoints[idx], self.contentOffset.y);
    NSLog(@"    Dragging Ended at: %3.0f, %3.0f --> %3.0f, %3.0f",
         myLocation.x, myLocation.y, menuPoint.x, menuPoint.y);
    [self setContentOffset:menuPoint animated:YES];
}

Я должен отметить, что он находится в симуляторе. Я пока не могу попробовать его на реальном телефоне, так как я еще не потратил деньги на программу разработки (ожидая, пока приложение будет почти готово к публикации, на случай, если я выдохнусь :)

это проблема симулятора? Кто-нибудь видел нечто подобное? О да, я должен спросить: я что-то не так делаю? ;)

Продолжение: Я думаю, проблема в том, что анимация замедления конфликтует с моим вызовом - (void) setContentOffset: animated: . Обе анимации продолжают работать, и в представлении отображается, какая из них выигрывает, но внутреннее состояние правильно основано на setContentOffset . Я думал, что setContentOffset отключил существующую анимацию. Есть ли, а если нет, как я могу его выключить?

7
задан Travis Jensen 27 March 2011 в 07:49
поделиться