像Instagram iOS8一样滚动时只隐藏导航栏

时间:2015-07-24 02:15:02

标签: ios uinavigationbar

在我的应用中,我试图在滚动时隐藏UITableViewController的导航栏。我尝试过使用self.navigationController.hidesBarsOnSwipe = YES;,但它添加了一个非常奇怪的底部空格并隐藏了UIStatusBar的背景。我想在向下滚动时隐藏导航栏,当向上滚动一点时,让navBar重新出现。我正在寻找的这种行为与Instagram的Feed非常相似,滚动时它隐藏了navBar。

有人可以指导我如何通过简单的代码实现这一点,而不涉及一些Github项目或任何类型的外部源。我想最终根据我的需求定制性能。感谢。

1 个答案:

答案 0 :(得分:0)

例如,将视图控制器注册为UIScrollViewDelegate。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate (BOOL)decelerate;

在de UIScrollViewDelegate方法中,您可以获取新的contentOffset并相应地向上或向下翻译您的UINavigationBar。

也可以根据您可以设置和计算的某些阈值和因子来设置子视图的alpha值。

希望它有所帮助!

或者您也可以使用此

@property (strong, nonatomic) NSArray *navBarItems;

    -(void)scrollViewDidScrollToTop:(UIScrollView *)scrollView
{
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){
        return;
    }

    CGRect frame = self.navigationController.navigationBar.frame;
    frame.origin.y = 20;

    if(self.navBarItems.count > 0){
        [self.navigationController.navigationBar setItems:self.navBarItems];
    }

    [self.navigationController.navigationBar setFrame:frame];
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){
        return;
    }

    CGRect frame = self.navigationController.navigationBar.frame;
    CGFloat size = frame.size.height - 21;

    if([scrollView.panGestureRecognizer translationInView:self.view].y < 0)
    {
        frame.origin.y = -size;

        if(self.navigationController.navigationBar.items.count > 0){
            self.navBarItems = [self.navigationController.navigationBar.items copy];
            [self.navigationController.navigationBar setItems:nil];
        }
    }
    else if([scrollView.panGestureRecognizer translationInView:self.view].y > 0)
    {
        frame.origin.y = 20;

        if(self.navBarItems.count > 0){
            [self.navigationController.navigationBar setItems:self.navBarItems];
        }
    }

    [UIView beginAnimations:@"toggleNavBar" context:nil];
    [UIView setAnimationDuration:0.2];
    [self.navigationController.navigationBar setFrame:frame];
    [UIView commitAnimations];
}