如何制作像Instagram一样的导航栏

时间:2013-03-12 21:14:25

标签: ios objective-c uitableview uiscrollview instagram

我需要实现这样的事情:

NavBar stay on top, tableView bounces

tableView必须退回,但不能导航栏。

我尝试了一堆不同的变种。 像这样:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect imageViewFrame = self.imageView.frame;
    CGRect tableViewFrame = self.tableView.frame;
    //ImageView - is top view(instead of NavBar)
    //defaultHeight - is default height of tableView
    imageViewFrame.origin.y = MIN(0, MAX(-scrollView.contentOffset.y, -100));
    tableViewFrame.origin.y = imageViewFrame.origin.y + 100;
    tableViewFrame.size.height = defaultHeight - imageViewFrame.origin.y;

    self.imageView.frame = imageViewFrame;
    self.tableView.frame = tableViewFrame;
}

得到这个:

1 2

它不适合因为在Instagram中,tableView的大小不会改变(只看滚动指示器,如果tableView的大小改变了,它们也会改变)

please look at scroll indicators please look at scroll indicators

此外,我尝试将View作为subView添加到tableView中,它可以工作,但不完全是我需要的。 在tableView外面的Instagram导航栏中,所以它也不适合。

在Facebook应用中,搜索栏的行为完全相同

enter image description here

任何人都可以帮助我吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

Instagram“导航栏”不是导航栏。这是一个表格标题。您会注意到,当您点击照片时,整个导航栏会滑落。那是因为它是表视图控制器的一部分而不是“真正的”导航栏。

您可以使用UINavigationController但隐藏导航栏(setNavigationBarHidden:YES)来实现此目的。你只需要手动调用pushViewController:animated:手动。

有趣的是,它看起来像Instagram的其他标签只是使用一个普通的导航栏,并没有做任何花哨的事情。我猜他们真的希望那些44点回到主进纸屏幕上。

答案 1 :(得分:1)

在示例代码中使用相同的方法,但不是增加tableview的高度,而是预先加载额外的(不可见的高度),然后通过减小帧的y来向上移动它。额外的高度将在屏幕外。如果内容高度不足以在屏幕外显示,那么您不需要具有屏幕外高度。

在开始时添加一个高度为0的标题,当您向下滚动时,它会增加大小,最多为100(空标题现在将关闭屏幕)。这样,滚动时内容就不会被切断。

答案 2 :(得分:1)

如果您的目标是iOS 5+,则可以轻松自定义导航栏,如下所示:

1-在UINavigationController中添加TableViewController

2-自定义导航栏:

设置导航栏的背景图像

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"bar_background"] 
                                   forBarMetrics:UIBarMetricsDefault];

在右侧添加刷新按钮

UIImage *img = [UIImage imageNamed:@"refresh.png"];
UIButton *rButton = [UIButton buttonWithType:UIButtonTypeCustom];
[rButton setImage:img forState:UIControlStateNormal];
[rButton addTarget:vc action:@selector(didTapRefreshButton:) forControlEvents:UIControlEventTouchUpInside];
rButton.frame = CGRectMake(0.0f, 0.0f, img.size.width, img.size.height);
UIBarButtonItem *rButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rButton];

self.navigationItem.rightBarButtonItem = rButtonItem;
[rButtonItem release];

希望有帮助!

答案 3 :(得分:0)

您可以在班级中使用下面提到的方法,在Instagram中为导航栏添加效果。

        - (void)scrollViewDidScroll:(UIScrollView *)sender {
//Initializing the views and the new frame sizes.
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.

if (isiOS7) {
     navBarFrame.origin.y = MIN(0, MAX(-44, (sender.contentOffset.y * -1)))  +20 ;
     tableFrame.origin.y = navBarFrame.origin.y + navBarFrame.size.height;
}else{
    navBarFrame.origin.y = MIN(0, (sender.contentOffset.y * -1)) +20;
    tableFrame.origin.y = MIN(0,MAX(-44,(sender.contentOffset.y * -1))) ;
}

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

}