【问题标题】:auto hiding and showing UINavigationBar like Instagram iOS app像 Instagram iOS 应用一样自动隐藏和显示 UINavigationBar
【发布时间】:2016-04-10 17:46:04
【问题描述】:

我有这段代码:

- (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 的行为,即每当您向上滚动时导航栏都会重新出现?

【问题讨论】:

    标签: ios uiscrollview uinavigationcontroller instagram


    【解决方案1】:

    我已经为这个更直观的代码废弃了手动框架代码:

    - (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 的阈值,以便它只对有意义的向上或向下滚动做出反应

    【讨论】:

    • 这看起来比您在问题中发布的要好得多,干得好!
    【解决方案2】:

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

    我真的不明白你在用你发布的代码做什么。您是每次都创建一个新的导航栏还是隐藏和显示同一个导航栏?

    无论如何,一旦检测到滚动方向,只需在ScrollDirection = ScrollDirectionUp 时显示导航栏。

    类似:

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

    【讨论】:

    • 你是对的,我最终搞砸了我的观点(我使用自动布局,所以手动框架代码效果不佳) - 我已经添加了我的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多