2016-01-06 99 views
0

我有这样的代码片段:自动隐藏和显示类似Instagram的iOS应用UINavigationBar的

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    UINavigationBar *navbar =self.navigationController.navigationBar; 
    UIView *tableView = self.view; 
    CGRect navBarFrame = self.navigationController.navigationBar.frame; 

    CGRect tableFrame = self.view.frame; 

    //changing the origin.y based on the current scroll view. 
    //Adding +20 for the Status Bar since the offset is tied into that. 

    navBarFrame.origin.y = MIN(0, MAX(-44, (scrollView.contentOffset.y * -1))) +20 ; 
    tableFrame.origin.y = navBarFrame.origin.y + navBarFrame.size.height; 

    navbar.frame = navBarFrame; 
    tableView.frame = tableFrame; 

} 

这让躲在我的导航栏的预期效果,但如果你滚动到导航只会重新出现滚动视图的顶部(y偏移量= 0)。如何在每次向上滚动时重新出现导航栏的情况下重新创建Instagram的行为?

回答

2

我已经报废了手动帧代码,这样更直观代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    if (lastContentOffset > scrollView.contentOffset.y) { 
     if (downwards) { 
      downwards = NO; 
      scrollDistance = 0; 
     } else { 
      scrollDistance++; 
     } 
    } 
    else if (lastContentOffset < scrollView.contentOffset.y) { 
     if (!downwards) { 
      downwards = YES; 
      scrollDistance = 0; 
     } else { 
      scrollDistance++; 
     } 
    } 
    lastContentOffset = scrollView.contentOffset.y; 
    CGFloat threshold = 10; 
    if (downwards && !self.navigationController.navigationBarHidden && scrollDistance > threshold) { 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    } else if (!downwards && self.navigationController.navigationBarHidden && scrollDistance > threshold) { 
     [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    } 

} 

这也增加了10px的阈值,这样只反应一个有意义的滚动向上或向下

+1

这看起来多少b而不是你在问题中发布的东西,好的工作! –

1

使用此链接来检测滚动方向:Detect Scroll Direction

我真的不明白你与你的代码,你贴在做什么。你是每次创建一个新的导航栏还是隐藏并显示同一个导航栏?

不管怎么说,一旦你检测滚动方向,只显示在导航栏ScrollDirection = ScrollDirectionUp时。

喜欢的东西:

if (ScrollDirection == ScrollDirectionUp) { 
    self.navigationController.navigationBar.hidden = NO; 
} 
+0

你是对的,我最终搞乱了我的观点(我使用自动布局,因此手册框架代码没有工作) - 我已经添加了我的解决方案 – Halpo