2014-09-23 3 views
4

У меня возникла проблема при создании механизма pull для обновления в нижней части прокрутки. Код работает совершенно гладко в iOS7, но в iOS8 scrollview мгновенно проскакивает, а затем оживляет до правильной позиции.UIScrollView setContentInset вызывает прокрутку прокрутки в ios8

Я отслеживаю прокрутку до тех пор, пока она не будет покрыта резиновой оболочкой за пределами kPullToRefreshHeightPX (в моем случае это 40 пикселей), а затем установите флаг для вставки и выпустите обновление содержимого.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (_webShouldInsetScrollView == NO && (scrollView.contentOffset.y > ((scrollView.contentSize.height - scrollView.frame.size.height) + kPullToRefreshHeightPX))) 
    { 
     _webShouldInsetScrollView = YES; 
    } 
} 

Если на конце тащит мы вытащили за пределами нашего обновления расстояния, то вставка (и запустить нашу маленькое обновление анимации) и показать следующую страницу результатов.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (_webShouldInsetScrollView) 
    { 
     [UIView animateWithDuration:0.2 animations:^{ 
       [scrollView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, kPullToRefreshHeightPX, 0.0f)]; 
     } completion:^(BOOL finished) { 
     }]; 

     [self performSelector:@selector(showNextResultsPage) withObject:nil afterDelay:1.0f]; 
    } 
} 

Я читал другие вопросы, с UIScrollViews в iOS8, один из которых говорил о automaticallyAdjustsScrollViewInsets быть установлен ложный в iOS7, но теперь верно по умолчанию в iOS8, но это не имеет никакого влияния на приведенном выше коде. Кто-нибудь еще имел подобный опыт и понял путь вокруг него?

+0

Я вижу точно то же самое. Пока не выяснили решение. – sha

ответ

7

исправить этот вопрос,: D

CGPoint offset = scrollView.contentOffset; 
[scrollView setContentInset:UIEdgeInsetsMake(topInset, 0, 0, 0)]; 
scrollView.contentOffset = offset; 
0

После поиска довольно долго я не могу найти подходящий ответ. И, посмотрев несколько реализаций pull-to-referh из github (запустив их в iOS8-симуляторе), я вижу, что все они показывают точно такие же прыжки на iOS8.

Вот что я смог сделать, чтобы свести к минимуму этот эффект. Чтобы повторить проблему: когда наш контроль обновления должен оставаться видимым, мы пытаемся настроить contentInset на значение нашей высоты управления в супервизии scrollView. Изменение содержимогоInset вызывает прокрутку содержимого (как на iOS7, так и на iOS8), а на iOS8 этот скачок вполне заметен.

Я удалял любые изменения в содержанииИзбранное в основном startRefresh Функция пользовательского pull-to-refres. В вашем случае - удалить целиком UIView animateWithDuration:0.2 animations от scrollViewDidEndDragging.

И добавить что-то подобное в scrollViewDidScroll обработчик (начало его):

if (self.isRefreshing) { 
    // If we already scrolled back past the point of our control height and we haven't changed 
    // contentInset yet - update it 

    if (scrollView.contentOffset.y > -CONTROL_HEIGHT && scrollView.contentInset.top == 0) { 
     UIEdgeInsets inset = scrollView.contentInset; 
     inset.top = CONTROL_HEIGHT; 
     scrollView.contentInset = inset; 
    } 
    return; 
} 

... 
1

У нас есть точно такой же вопрос ...

После рыть глубже я видел, что как-то изначально цель вставка установлена ​​где-то:

давайте говорить, что я спустить Tableview от 200 до 500 - на scrollViewDidEndDragging я запустить анимацию, как это:

[UIView animateWithDuration:0.2 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         scrollView.contentInset = targetInset; 
        } 
        completion:nil]; 

    [self sendActionsForControlEvents:UIControlEventValueChanged]; 

Вместо анимировать плавно от 500 до задней -Давайте сказать- 250, тем targetValue (250) устанавливается один раз перед правильными анимированными значения установлены ...

Мой Обход было установить animation- перед запуском анимации. Сбросить его в комплекте-блок ... проверяет, скроллер этот флаг и устанавливает targetValue только если анимация закончилась:

_isAnimatingInset = YES; 
_currentTopInsetTarget = targetInset.top; 

[UIView animateWithDuration:0.2 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         scrollView.contentInset = targetInset; 
        } 
        completion:^(BOOL finished) { 
         //Workaround for a iOS8-Bug see property-comment for further infos 
         _isAnimatingInset = NO; 
         scrollView.contentInset = targetInset; 
        }]; 

    [self sendActionsForControlEvents:UIControlEventValueChanged]; 

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

Смежные вопросы