Вопрос по ios, ios5 – scrollViewWillEndDragging: withVelocity: targetContentOffset: не работает по краям UISCrollView

28

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

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

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

Я проверил с помощью отладчика, и targetContentOffset-> g действительно равен 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

Ваш Ответ

5   ответов
9

Теперь все работает как надо.

3

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

Большое спасибо за ответ. Вы правы. Я тоже исследовал и говорил с другими людьми и обнаружил, что это ошибка. Просто забыл ответить на мой собственный вопрос, извините (если вы хотите более подробно, пожалуйста, посмотрите на него). Смещение как 0.1, кажется, делает это. Во всяком случае, большое спасибо. dvieira
0

то внутри функции scrollViewWillEndDragging: withVelocity: targetContentOffset: function вы можете вызвать:

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

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

15

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

Я также испытываю эту проблему. Есть ли шанс, что вы можете опубликовать номер идентификатора ошибки Apple & # x2014; или, что лучше, ссылку на запись OpenRadar & # x2014; чтобы помочь себе и, возможно, другим, опубликовать дубликат отчета об ошибке? (Достаточно хорошо известно, что Apple отдает приоритет исправлению ошибок в зависимости от количества полученных отчетов).
Конечно. Это дубликат 10255505, но, похоже, его нет в OpenRadar. В любом случае, похоже, что оно сейчас закрыто, но я не знаю, выпустят ли они исправление или нет. dvieira
8

ое от нуля или размер контента, как это было предложено 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 пункт.

Похожие вопросы