16

似乎删除带有动画的导航栏的唯一方法是向上滑动。我希望它褪色,就像在 Photos.app 中一样。

更改 alpha 是最简单的,但是Apple 的指导方针指出

在 iOS v5.0 之前,当与导航控制器一起使用时,您只能对导航栏进行少量直接自定义。具体来说,可以修改 barStyle、tintColor 和 translucent 属性,但绝对不能直接更改 UIView 级别的属性,例如 frame、bounds、alpha 或 hidden 属性。

该语言有点奇怪,因为它在 iOS 5 之前声明,但它声明您不允许直接更改 alpha 值,并且它从未声明您现在可以这样做。

我不希望我的应用被拒绝。

如何像状态栏一样淡出导航栏?

4

6 回答 6

13

这是一个有趣的解决方案。

它应该非常简单:用于UIView transitionWithView在导航栏的隐藏和非隐藏状态之间执行交叉淡入淡出,由公共 API 设置setNavigationBarHidden:animated:。事实上,这适用于“淡出”导航栏,但将其淡入会出现问题。问题是导航栏会滑入到位,不管事实UIView +transitionWithView:是否不为动画属性(例如frame)设置动画,除非您指定UIViewAnimationOptionAllowAnimatedContent.

对我来说,这说明无论是否在调用中指定了动画,动画块内部都会UINavigationController重新定位。当设置为时,此动画块的持续时间可能设置为“0” 。UINavigationBarsetNavigationBarHidden:animated:animate:NO

解决方案是在交叉淡入淡出过渡之前将导航栏设置为可见(无动画)。这确保了导航栏在正确的位置开始交叉淡入淡出,并且交叉淡入淡出只会显示新的非隐藏状态。

我的示例项目是一个标准的单视图应用程序。故事板上有一个UINavigationController,它是入口点。我将此控制器的条形样式设置为UINavigationBar黑色半透明(类似于照片应用程序)。导航控制器rootViewController是一个简单UIViewControllerUIImageView填充整个边界(也像照片应用程序)。我在视图上添加了一个UITapGestureRecognizer在视图控制器中调用以下代码:

- (IBAction) onShowHideNavbar: (id) sender
{
    BOOL hide = !self.navigationController.navigationBarHidden;

    if ( !hide)
    {
        [self.navigationController setNavigationBarHidden: hide animated: NO];
    }

    [UIView transitionWithView: self.navigationController.view
                      duration: 1
                       options: UIViewAnimationOptionTransitionCrossDissolve
                    animations: ^{

                        [self.navigationController setNavigationBarHidden: hide animated: NO];
                    }
                    completion: nil ];
}

综上所述,我认为您不会因为UINavigationBar直接弄乱隐藏或 alpha 属性而遇到任何麻烦(Apple Rejection)。文档警告不要触摸这些,因为它们由 UINavigationController 管理,更改它们可能会产生看不见的后果。但在我看来,它们是公共 API,因此使用它们不应成为拒绝的理由。

于 2013-08-05T17:17:19.897 回答
6

您不能合法地为 UINavigationController 的导航栏的属性设置动画。
但是,您可以显示带有隐藏导航栏的导航控制器(根据您的喜好,始终或仅在特定视图控制器上隐藏它),并将其替换为您的“特殊”实例UINavigationBar;-)

我附上了一个示例项目(我使用 Xcode 模板更快地创建它):FakeNavBar

看下viewDidLoad方法DetailViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];

    self.fakeBar = [[UINavigationBar alloc]initWithFrame:self.navigationController.navigationBar.bounds];


    UIBarButtonItem *back = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back)];



    UINavigationItem *backItem = [[UINavigationItem alloc]initWithTitle:@"Back"];
    backItem.leftBarButtonItem = back;
    [self.fakeBar pushNavigationItem:backItem animated:YES];

    [self.view addSubview:self.fakeBar];

}

这是YouTube 上最终产品的视频。

于 2013-08-01T14:21:01.897 回答
2

解决这个问题的一种方法(我不确切知道您打算如何为下一个视图设置动画或以何种方式合并淡入淡出)是将当前视图渲染为 uiimage,使用此图像制作全屏 UIImageView (基本上用它的图片替换您现有的 UIView)在图像视图后面的新视图中交换,然后淡出图像视图。

您还可以仅裁剪图像的 UInavigationBar 部分并在过渡后淡化它。这样您就可以将任何图像效果应用到“UINavgationBar”而不会被苹果拒绝。

于 2013-07-28T23:08:57.087 回答
1

我知道没有苹果认可的方法来做到这一点。我怀疑你会因为修改 navigationBar 的 alpha 值而被拒绝,但和你一样,我不确定。

你当然可以实现你自己的导航控制器/导航栏,你可以用它做任何你想做的事情。当我需要做这样的事情时,这就是我在我的应用程序中所做的。苹果对此完全没有问题。加分项:如果您使用自定义控件,Apple 可以随意更改其控件,而不会破坏您的布局。这是最近在我们应用程序的某些区域出现的问题,在不同版本的 iOS (7) 中,应用程序看起来非常不同。

无论如何,这是我的2美分...

于 2013-07-28T23:48:08.747 回答
0

如果您继续阅读,这是您引用之后的下一段:

在 iOS v5.0 及更高版本中,您可以使用“自定义栏外观”中列出的方法自定义栏的外观。您可以使用外观代理([UINavigationBar 外观])自定义所有导航栏的外观,或者仅自定义单个栏的外观。

单击链接(自定义栏外观)将向您显示:

自定义 Bar Appearance
tintColor 属性
– backgroundImageForBarMetrics:
– setBackgroundImage:forBarMetrics:
– titleVerticalPositionAdjustmentForBarMetrics:
– setTitleVerticalPositionAdjustment:forBarMetrics:
titleTextAttributes 属性

因此,在 iOS v5.0 及更高版本中,这是您可以(合法)更改的列表。您可能可以使用 tintColor 的 alpha 或背景图像玩一些游戏,以使其看起来像是淡出(然后将其隐藏),但我怀疑它看起来是否正确。不过可能值得一试。

于 2013-07-28T23:40:48.807 回答
0

您可能无法轻松淡化导航栏,但您可以轻松淡化导航栏的图片。所以你可以做的一件事是创建导航栏的图像,用你的图像替换导航栏,然后用 alpha 为 0 设置图像视图的动画。或者你可以做相反的事情:将图像视图放在顶部导航栏,并淡入应该在导航栏后面的任何图像。

于 2013-08-01T14:53:13.973 回答