9

我需要实现这样的事情:

NavBar 保持在顶部,tableView 弹跳

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 的大小发生变化,它们也会发生变化)

请查看滚动指示器 请查看滚动指示器

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

在 facebook 应用程序搜索栏的行为完全相同

在此处输入图像描述

谁能帮我?

谢谢!

4

4 回答 4

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];

希望有帮助!

于 2013-03-13T05:17:23.497 回答
1

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

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

有趣的是,Instagram 的其他标签看起来只是使用普通的导航栏,并没有做任何花哨的事情。我猜他们真的想把这 44 分重新放在主屏幕上。

于 2013-03-12T21:35:36.960 回答
1

在示例代码中采用相同的方法,但不是增加 tableview 的高度,而是预先加载了额外的(不可见高度),然后通过减小框架的 y 将其向上移动。额外的高度将在屏幕外。如果内容高度不够大而无法离屏,那么您不需要离屏高度。

在开始时添加一个 height = 0 的标题,向下滚动时它会增加大小,最多为 100(空标题现在将不在屏幕上)。这样,滚动时内容就不会被截断。

于 2013-03-12T22:28:59.440 回答
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;

}
于 2014-04-02T13:33:57.970 回答