2012-01-31 2 views
0

У меня есть UIView с контентом, и я реализую функцию pull-to-refresh. Как настроить UIScrollView для возврата к contentOffset 0,0 (и сделать его естественным)?Заставить UIScrollView всегда в CGPointZero, если не потянуть, чтобы обновить

Я видел много примеров этого с помощью UITable View, и у вас есть попытка обновить поведение довольно. Кажется, что у моей проблемы большой размер контента, чтобы разместить скрытый баннер Pull-To-Refresh. Если я прокручу контент вниз, он снова закроется. Если я вытащил содержимое, он лениво прокручивает назад, но не в то же самое точное положение.

Я реализовал функцию ниже, которая будет определять прокрутку прокрутки. Затем он снова разместит представление до 0,0. Этот вид работ, но выглядит нервным или отстает в анимации.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
{ 
    if(moveScrollView) 
     [moveScrollView invalidate]; 

moveScrollView = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(moveScrollViewToOrigin) userInfo:nil repeats:NO]; 
} 

- (void)moveScrollViewToOrigin; 
{  
    if(scrollView.contentOffset.y == 0) 
     return; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.2]; 
    [[self scrollView] setContentOffset:CGPointZero]; 
    [UIView commitAnimations]; 
} 

Я создал образец проекта с проблемой и мое решение here.

ответ

1

Положение прокрутки, по-видимому, ведет себя так, как ожидалось, при вытягивании содержимого вниз. Когда экран изначально загружается, баннер pull-to-refresh скрыт сверху, а вы нажимаете контент вверх. Содержимое не всегда вернитесь, насколько это возможно. Иногда смещение y составляет 40, когда он заканчивается подпрыгиванием. Это все поддаётся проверке по моему примеру, который я опубликовал.

Поскольку проблема изолирована, позволяя contentOffset.y быть больше нуля, я решил отключить это поведение. Я поместил следующее в (void) scrollViewDidScroll: (UIScrollView *) scrollingView;

if(scrollingView.contentOffset.y > 0){ 
    //content is moving up and the Refresh banner is already hidden 

    //disable scrolling 
    [[self scrollView] setScrollEnabled:NO]; 

    //move content back to origin, do not animate   
    CGRect originBounds = self.scrollView.bounds; 
    originBounds.origin.y = 0.0f; 
    [[self scrollView] scrollRectToVisible:originBounds animated:NO]; 

}else 
{ 
    [[self scrollView] setScrollEnabled:YES];   
} 
0

вы пробовали -scrollRectToVisible:animated:? Это приводит к тому, Scrollview выполнить фактический свиток (который будет запускать -scrollviewDidScroll: и оживляет его как обычная прокрутку действие на указанный кадр в пределах его области содержимого.

[[self scrollView] scrollRectToVisible:self.scrollView.bounds animated:YES]; 

должен дать вам хорошую и плавные прокрутив происхождение

+0

Спасибо, но это помогает в анимации, а не в поведении. Я играю с сенсорными и прокручивающими событиями, чтобы даже не допустить, чтобы пользователь прокручивал контент, если только они не потянули значок «Обновить баннер». Теперь мне интересно, должен ли я просто использовать UIView, который позволяет вам сворачивать контент вниз, а затем создавать резервные копии. – Travis

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