滚动tableview时隐藏NavigationControllerBar

时间:2015-12-11 08:06:36

标签: ios objective-c iphone uitableview uinavigationbar

我已经实现了一个UITableViewController。

第一部分是一张大图。当视图控制器最初出现时,我将navigationBar设置为半透明。

当向下滚动tableview时,navigationBar.translucent设置为NO,并且tableview内容框架向上移动,以便第一部分不在屏幕上。我在scrollview委托中实现了这个动作:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

当桌面视图向上滚动时,导航再次变为半透明,并恢复了桌面视图框架。

问题是,当scrollview委托捕获滚动手势时。一旦tableview和navigationBar开始动画。 tableview的滚动动作停止。因此,如果我想将tableview滚动到底部,我必须滚动两次,第一次动画帧然后再滚动,我认为它可以增强。

这是代码。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == _subTable) {
    NSIndexPath * indexPath ;
    CGFloat offset = scrollView.contentOffset.y;
    if ((offset - currentOffset)>40) {

        if (!scrollAnimate) {
            self.navigationController.navigationBar.translucent = NO;
            [UIView animateWithDuration:0.5 animations:^{
                [_mainTable setContentOffset:CGPointMake(0, headHeight) animated:YES];
                [_subTable setFrame:CGRectMake(CGRectGetWidth(self.menuTable.frame)                                                                                                                                                                                                                                                                                                                                                                                              , 0, kScreen_Width/3.5*2.5, kScreen_Height-schedualHeight-48)];
                [_mainTable setFrame:CGRectMake(0, 0, kScreen_Width, _mainTable.frame.size.height+headHeight)];
                [_menuTable setFrame: CGRectMake(0, 0, kScreen_Width/3.5, _mainTable.frame.size.height+headHeight-48)];
            }];

            if (CGRectGetMaxY(_checkOutBar.frame)!= kScreen_Height-44)
            {
                [_checkOutBar setFrame:CGRectOffset(_checkOutBar.frame, 0, -44)];
            }
            scrollAnimate = !scrollAnimate;
            frameOffset = !frameOffset;

            [_mainTable reloadData];
            _checkOutBar.tag = 1000;
        }

    }
    else if((offset - currentOffset)<-40)
    {

        if (scrollAnimate) {
            self.navigationController.navigationBar.translucent = YES;
            [UIView animateWithDuration:0.5 animations:^{
                [_mainTable setFrame:CGRectMake(0, 0, kScreen_Width, kScreen_Height+self.navigationController.navigationBar.frame.size.height+headHeight)];
                [self.mainTable setFrame:CGRectOffset(_mainTable.frame, 0, -(self.navigationController.navigationBar.frame.size.height))];
                [_subTable setFrame:CGRectMake(CGRectGetWidth(self.menuTable.frame), 0, kScreen_Width/3.5*2.5, tableHeight)];
                [_menuTable setFrame:CGRectMake(0, 0, kScreen_Width/3.5, tableHeight)];
            }];
            scrollAnimate = !scrollAnimate;
            frameOffset = !frameOffset;

            [_mainTable reloadData];
            if (CGRectGetMaxY(_checkOutBar.frame)!= kScreen_Height) {
                [_checkOutBar setFrame:CGRectOffset(_checkOutBar.frame, 0, 44)];
            }
            _checkOutBar.tag = 2000;
        }
    }
    if ((offset - currentOffset)>0)
    {
        indexPath = [[_subTable indexPathsForVisibleRows]lastObject];
    }
    else
    {

        indexPath = [[_subTable indexPathsForVisibleRows]firstObject];
    }

    if (indexPath) {
        if (indexPath.row == 0) {
            selected = indexPath.section;
                [_menuTable reloadData];
            }
        }

        currentOffset = offset;
    }
}

1 个答案:

答案 0 :(得分:0)

来自Apple文档。设置NavigationController。 hidesBarsOnSwipe = YES;     hidesBarsOnSwipe      属性     一个布尔值,指示导航栏是否隐藏其条形以响应滑动手势。

声明:
SWIFT:

var hidesBarsOnSwipe: Bool

目标-C:

@property(nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe

讨论:

当此属性设置为YES时,向上滑动会隐藏导航栏和工具栏。向下滑动再次显示两个条形。如果工具栏没有任何项目,即使在滑动后它仍然可见。此属性的默认值为NO

状况: 适用于iOS 8.0及更高版本。