Изменения в UIScrollView contentOffset не прилипают при замедлении - PullRequest
3 голосов
/ 13 июля 2010

Я посмотрел на UIScrollView. Любые мысли о реализации "бесконечной" прокрутки / масштабирования? , но это не совсем решило мою проблему. Однако я озадачен, потому что думаю, что другие люди не видели мою проблему, поэтому, возможно, это связано с подробностями моего кода. Пример кода, предоставленного Allisone, похож на мой, хотя я использую scrollViewDidScroll для мониторинга contentOffset вместо пользовательского подхода KVO.

Когда мой UIScrollView замедляется, если я вставляю подпредставление слева от границ UIScrollView и увеличиваю contentOffset на ширину моего вставленного подпредставления, мое изменение в contentOffset игнорируется; содержимое «перепрыгивает» на ширину вставленного подпредставления, и поток значений contentOffset продолжает свою текущую траекторию при последующих вызовах scrollViewDidScroll. При простом отслеживании проблем нет. Есть ли что-то, что я, вероятно, делаю не так? Это почти как если бы bounds или contentOffset были привязаны к событиям замедления.

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

Сначала я надеялся, что проблема была вызвана изменением содержимого UIScrollView из выноски на scrollViewDidScroll, поэтому я дважды проверил, выполнив задержанный executeSelector, но проблема осталась.

Спасибо, Kevin

Ответы [ 2 ]

1 голос
/ 23 декабря 2012

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

tScrollView : UIScrollView

In tScrollView.m:

- (void)recenterIfNecessary {
    if (_tDelegate && [_tDelegate respondsToSelector:@selector(offsetForRecenterScrollView:)])
        self.contentOffset = [_tDelegate offsetForRecenterScrollView:self];
}
- (void)layoutSubviews {
    [super layoutSubviews];
    [self recenterIfNecessary];
}

Реализация offsetForRecenterScrollView: в делегате и возврат нового CGPoint для установки в scrollView.contentOffset.

1 голос
/ 01 июня 2011

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

...