2013-10-24 2 views
3

Я попытался реализовать такое табличное представление, которое обнаруживает количество прокрутки и решает показать панель навигации или нет.iOS скрывает панель навигации из-за количества прокрутки

@interface HomeViewController() { 
NSInteger scrollAmount; 
bool navbarHidden = NO; 
} 

@implementation HomeViewController 
@synthesize lastContentOffset = _lastContentOffset; 
bool navbarHidden = NO; 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    scrollAmount = 0; 
    distance = 50; 
} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGPoint offset = scrollView.contentOffset; 
    CGRect bounds = scrollView.bounds; 
    UIEdgeInsets inset = scrollView.contentInset; 
    if (offset.y > self.lastContentOffset.y) 
    { 
     scrollAmount++; 
    } 
    else 
    { 
     scrollAmount--; 
    } 
    bool awayFromTop = offset.y > distance + inset.top; 
    if (awayFromTop && !navbarHidden) { 
     [[self navigationController] setNavigationBarHidden:YES animated:YES]; 
     navbarHidden = YES; 
    } else if (!awayFromTop || (scrollAmount < -100)) { 
     [[self navigationController] setNavigationBarHidden:NO animated:YES]; 
     navbarHidden = NO; 
    } 
    self.lastContentOffset = offset; 
} 

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    scrollAmount = 0; 
} 

В основном, scrollViewDidScroll подсчитывает количество прокрутки, а если пользователь прокручивает вверх, то декремент scrollAmount на минус 1.

offset И если достаточно близко к верхней части экрана (!awayFromTop) ИЛИ количество прокрутки меньше -100, ожидается, что панель навигации будет скрыта.

Когда я положил NSLog для scrollAmount программа работает правильно, она скрывает nav. бар, когда пользователь находится сверху или показывает, когда приближаются к вершине и scrollAmount.

Но когда scrollAmount достигает значения -100 [[self navigationController] setNavigationBarHidden:NO animated:YES]; не выполнен и как-то scrollViewDidScroll называется бесконечно, я имею в виду, что программа вводит бесконечный цикл. scrollAmount печатается как -100, -101, -102, ..., - 1005 ...

Тогда я использовал ниже код:

if ([scrollView.panGestureRecognizer translationInView:self.view].y < heightOfScreen/-4.0f && !navbarHidden) { 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
     navbarHidden = YES; 
} else if ([scrollView.panGestureRecognizer translationInView:self.view].y > heightOfScreen/4.0f && navbarHidden) { 
     [self.navigationController setNavigationBarHidden:NO animated:YES]; 
     navbarHidden = NO; 
} 

Очевидно [scrollView.panGestureRecognizer translationInView:self.view].y дает н. аналогично scrollAmount, но он отлично работает, теперь мне интересно, почему моя реализация не удалась. Любые идеи оценили.

ответ

0

Код выглядит правильно, но если бы я тебя, я хотел бы использовать

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

для отслеживания просмотра прокрутки прокрутки, потому что scrollViewDidScroll генерирует некоторое странное поведение в моем приложении тоже. Возможно, вы бы хотели попробовать.

+0

На самом деле я включил альтернативное и рабочее решение в вопрос ('scrollView.panGestureRecognizer'). Однако мне нужно выяснить это странное поведение. Ответ, который примет знак, будет тем, который дает правильное устранение неполадок, но спасибо за ваше предложение, может быть, некоторые могут его использовать. –

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