【问题标题】:Show and hide Navigation bar on tableView Scrolling在 tableView 滚动上显示和隐藏导航栏
【发布时间】:2014-06-08 10:26:19
【问题描述】:

tableview 滚动时显示和隐藏导航栏,最初导航栏是隐藏的。Tableview 仅包含一个节标题,当我们向上滚动时,节标题会到达顶部,但是当我们稍微向下滚动时,状态栏和导航栏会动画显示将节标题拉下但是随着部分标题向下滚动导航栏和状态栏隐藏。我想实现这种情况。我正在尝试实现这一点,但由于导航栏最初是隐藏的,并且导航栏会产生抽搐效果,并且在隐藏导航栏时也是如此。请帮帮我。

【问题讨论】:

  • 请张贴一些代码和图片来说明您要完成的工作。如果动作不稳定,您可以尝试在视图上使用 animateWithDuration 为过渡设置动画。

标签: objective-c uitableview ios7 uinavigationbar


【解决方案1】:

您描述的解决方案类似于 Facebook、Instagram 和 Chrome 的解决方案,只是您说导航栏最初应该隐藏。

This thread 有几个 Facebook 风格导航栏的解决方案,甚至还有 link to a control。它仍然可能是您所追求的。

【讨论】:

  • 感谢您的链接。如果你玩过 Google+ iPhone 应用程序,任何公共用户的个人资料部分,这正是我想要的。
  • 我明白了。 Google+ 有很多事情要做 - 视差标题照片;一个带有标签部分的栏粘在顶部,然后是一个导航栏,只有当带有标签部分的栏位于顶部时向下滚动时才会出现导航栏。我认为导航栏本身类似于 GTScrollNavigationBar(链接中的组件)
  • 正是导航栏,如果您向下滚动并且部分标题开始移动导航栏隐藏,则会出现。
  • 但是如果最初导航栏是隐藏的,如果我们显示导航栏 opaque ,它会降低视图的高度并在显示和隐藏时创建一个混蛋。
  • 如我所见 - Google+ 中的滚动视图内容位于导航栏下方,因此当导航栏显示或隐藏时滚动视图的高度不会改变。
【解决方案2】:

我认为抖动可能是由于表格视图在滚动到顶部或底部后弹跳造成的。

在隐藏/显示栏之前,您应该有一个阈值。

来自here的一些示例代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // ...

    // Register for KVO
    if (_hidesBarsOnScroll)
    {
        [_scrollView addObserver:self
                      forKeyPath:@"contentOffset"
                         options:NSKeyValueObservingOptionOld
                         context:nil];
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    CGPoint oldOffset = [(NSValue *)change[NSKeyValueChangeOldKey] CGPointValue];

    if (!_hidesBarsOnScroll || _scrollView.contentOffset.y == oldOffset.y)
        return;

    // Show on scroll up
    if (_barsHidden &&
        _scrollView.contentOffset.y < oldOffset.y &&
        _scrollView.contentOffset.y + _scrollView.bounds.size.height < _scrollView.contentSize.height) // Skip on bottom
    {
        [self.navigationController setNavigationBarHidden:NO
                                                 animated:YES];
        [self.tabBarController setTabBarHidden:NO
                                      animated:YES];
        _barsHidden = NO;
    }

    // Hide on scroll down
    if (!_barsHidden &&
        _scrollView.contentOffset.y > 0 && // Skip on top
        _scrollView.contentOffset.y > oldOffset.y)
    {
        [self.navigationController setNavigationBarHidden:YES
                                                 animated:YES];
        [self.tabBarController setTabBarHidden:YES
                                      animated:YES];
        _barsHidden = YES;
    }
}

至于 Google+ 在我看来是如何工作的,我不认为这是一个部分标题,而是当您向下滚动时从表格视图移出到控制器视图的单元格内容。

controller > view > tableView > cell > contentView > sectionHeaderLikeView

当你滚动时(使用委托或 KVO)变成:

controller > view > tableView > cell > contentView
                  > sectionHeaderLikeView

显示和隐藏条形调整控制器的view 并保持sectionHeaderLikeView 就位。

【讨论】:

  • 您好,感谢您的回答,您可以查看 google+ 并访问任何人的个人资料页面,并在我想要的相同场景中上下滚动它。
  • #Rivera,我被困在这种情况下,您能否提供一些帮助代码,我的导航栏最初会被隐藏。这将是一个很大的帮助。
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多