2013-10-24 79 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計數滾動量,並且如果用戶向上滾動,則通過減去1

遞減scrollAmount如果offset足夠接近屏幕的頂端(!awayFromTopOR滾動量小於-100,預計導航欄被隱藏。

當我爲scrollAmount程序運行一個NSLog正確時,它隱藏了nav。當用戶離開頂部時顯示,或顯示頂部和scrollAmount正確打印時顯示。

但是,無論何時scrollAmount達到-沒有執行,並以某種方式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')中包含了一個替代和工作解決方案。不過,我需要弄清楚這種奇怪的行爲。答案將會是正確的故障排除,但感謝您的建議,也許有些人可以利用它。 –