Подтвердить что ты не робот

ScrollViewWillEndDragging: withVelocity: targetContentOffset: не работает на краях UISCrollView

Я пытаюсь реализовать пользовательскую панель вкладок, которая является прокручиваемой и имеет подкачку на каждом элементе панели вкладок. Для этого я использую делегат scrollViewWillEndDragging: withVelocity: targetContentOffset: который отлично работает с одной проблемой.

Как работает мой пейджинг, если contentOffset находится рядом с правильным элементом, то targetContentOffset изменяется на смещение этого элемента. То же самое для левой стороны.

Проблема в том, что всякий раз, когда я нахожусь в левой половине первого элемента и справа от последнего (представление прокрутки работает по горизонтали), оно должно перейти в ContentOffset 0 и смещение содержимого самого правого элемента (минус на экране), но это не так.

Я проверил с отладчиком, а targetContentOffset- > x действительно 0 (в первом случае - слева от самого левого элемента). Поэтому проблема в том, что UIScrollView не прокручивается. Я потерян.

Вот мой реализованный делегат:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                 withVelocity:(CGPoint)velocity
          targetContentOffset:(inout CGPoint *)targetContentOffset{
     NSInteger index = lrintf(targetContentOffset->x/self.tabWidth);
     targetContentOffset->x = index * self.tabWidth;
}

Вот диаграмма, поясняющая, что я хочу сделать.

|-------|-------|-------|-------|-------|-------|-------|
|       |       |       |       |       |       |       |
|       |       |       |       |       |       |       |
|_______|_______|_______|_______|_______|_______|_______|

        |_______________________________________|
         where it is and i scroll it to the left

   <----|

   |_______________________________________|
              where it would stop

|_______________________________________|
        where i want it to stop
4b9b3361

Ответ 1

Это известная проблема. После некоторого расследования и беседы с другими людьми было высказано предположение, что это может быть ошибка, которая оказалась правильной. Я сообщил об этом Apple и был отмечен как дубликат, но все еще открыт. Просто отвечая тем из вас с той же проблемой. Я обдумываю это, как предлагает Big Papoo, используя смещение, близкое к тому, что я хочу (0.1, похоже, это делает). То же самое для правого конца.

Ответ 2

Я попытался установить окончательное смещение на что-то немного с нуля или на размер содержимого, как было предложено Big Papoo, но заметил, что это устраняет отскок сверхпрокрутки. Мое решение состояло в том, чтобы проверить исходный targetContentOffset, чтобы убедиться, что он равен нулю или contentSize и оставить его, если он:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    float expectedOffset = targetContentOffset->x;
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset.

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset.

    // Adjust the offset to make sure it works.
    if (targetOffset == 0) targetOffset = 1;
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1;

    targetContentOffset->x = targetOffset;
}

Вы можете, конечно, использовать scrollViewDidEndDecelerating: для перемещения прокрутки в 1 точку.

Ответ 3

Проблема Исправлена ​​в iOS 6.0.

Теперь он работает так, как должен.

Ответ 4

Я обнаружил 2 недокументированных поведения, которые вы можете исследовать: - Установка нуля в качестве окончательного смещения не работает, я предлагаю положить 1 или ничего больше нуля (0.5 может работать, а не проверяться) - Лучше проверить знак скорости и вычислить свое окончательное смещение в левой или правой части текущей точки, где пользователь удален, пальцем. Не пытайтесь сделать прокрутку назад на другую сторону.

Ответ 5

Если вы используете горизонтальное представление таблицы, то внутри вашей функции scrollViewWillEndDragging: withVelocity: targetContentOffset: вы можете вызвать:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES];

Я нашел, что это работает намного лучше, чем пытаться манипулировать targetContentOffset- > y в горизонтальном представлении таблицы.