为啥我的 UINavigationBar 不会动画?

Posted

技术标签:

【中文标题】为啥我的 UINavigationBar 不会动画?【英文标题】:How come my UINavigationBar won't animate?为什么我的 UINavigationBar 不会动画? 【发布时间】:2012-09-05 06:46:39 【问题描述】:

我正在尝试让我的应用程序正常工作,以便在根视图控制器中没有导航栏可见,并且当我将另一个视图控制器推送到我的堆栈上时(使用 Storyboard segues),导航栏动画进入视图(淡入在视图滑入视图时查看)。

按照其他 SO 文章中的建议,我的根控制器中有以下内容:

- (void)viewWillAppear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];


- (void)viewWillDisappear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];

导航栏确实出现/消失了,只是没有动画(淡入/淡出)。

我使用的是黑色半透明条,但我尝试了所有类型的条,没有任何区别。这是在 iPhone 应用程序上。我也尝试过模拟器和非模拟器。有什么想法吗?

我现在制作了一段视频,展示了我的应用正在做什么:

http://youtu.be/B9fuCc2Jqtg

所以为了清楚起见,它正在正确地出现和消失,但它是突然发生的。我正在尝试让它在此过渡期间淡入/淡出。

我现在在 Xcode 4 / ios 5.1 中添加了一个指向我的演示项目的链接:

https://www.dropbox.com/sh/mwsgjyup4iumy2r/QNN7xkHXSt

更新/回答:最终证明我的代码是“有效的”,因为它正在执行 Apple 的预期,动画导航栏滑入视图。我的错误印象是它也应该同时将导航栏从不可见淡化为可见,但这不是它的工作原理。

感谢@E。 Lüders 的动画代码,展示了如何按照我的意图进行操作。

【问题讨论】:

您的代码非常适合我。它就像在您的视频中一样,这就是动画 = YES 发生的方式。你究竟想如何淡化你的导航栏? alpha 值? 我在下面编辑了我的答案并添加了淡入/淡出动画 使用“viewDidAppear”可能更有意义。从另一个动画中开始动画不是一个好主意。 【参考方案1】:

我刚刚实现了这个测试代码,它工作正常。在我的 Storyboard 中,导航栏是可见的。

//  ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end


//  ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewWillAppear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];


- (void)viewWillDisappear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillDisappear:animated];


- (void)viewDidLoad

    [super viewDidLoad];

    // Hide navigationbar on view load
    [self.navigationController setNavigationBarHidden:YES];
    // Do any additional setup after loading the view, typically from a nib.


@end


//////////////////////////////////////////////////////////////
// This controller gets pushed                              //
//////////////////////////////////////////////////////////////

//  ViewController2.h
#import <UIKit/UIKit.h>
@interface ViewController2 : UIViewController
@end


//  ViewController2.m
#import "ViewController2.h"
@implementation ViewController2
@end

希望这会有所帮助。


编辑:

如果您想在导航栏上显示淡入/淡出效果,请将上面的代码更改为:

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];

    [UIView animateWithDuration:0.5f animations:^
        self.navigationController.navigationBar.alpha = 0.0f;
     completion:^(BOOL finished) ];


- (void)viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];
    self.navigationController.navigationBar.alpha = 0.0f;
    [self.navigationController setNavigationBarHidden:NO animated:animated];

    [UIView animateWithDuration:0.5f animations:^
        self.navigationController.navigationBar.alpha = 1.0f;
     completion:^(BOOL finished) ];

【讨论】:

我开始了一个新项目,使用了您上面的确切代码,但我仍然遇到问题。我想知道这是否可能是 iOS 6 SDK 或 Xcode 4.5 中的错误?我将尝试找到 Xcode 4 / iOS 5 的发布版本,看看那里是否可以。 我添加了一个视频演示,展示了我的应用程序正在做什么(我也在 iOS 5.1 中复制它):youtu.be/B9fuCc2Jqtg 添加了我的演示项目的链接:dropbox.com/sh/mwsgjyup4iumy2r/QNN7xkHXSt 感谢您的帮助。我想我在想“animate = YES”不会将栏滑入视野,但也会将其淡入视野,因为它在屏幕上不可见。我尝试了您的淡入淡出代码,但效果并没有真正起作用,因为它淡入淡出的背景颜色是黑色。如果它是透明的,它会很好用。我将您的答案标记为答案,但如果您对如何在背景透明的情况下发生褪色有任何想法,请告诉我? 我收回我刚刚写的东西......这完美!我最初在我的“测试应用程序”中对其进行了测试,但它并没有像我预期的那样运行。我将代码移到了我的真实应用程序中,它完全按照我的预期工作。谢谢!【参考方案2】:

您可以在隐藏动画块之前将 Alpha 设置为 0,而不是设置隐藏。

类似的东西:

- (void)viewWillAppear:(BOOL)animated

    //fade Animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    self.navigationController.view.alpha = 0.0;
    [UIView commitAnimations];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];

【讨论】:

感谢您的回复,但这似乎不起作用。我认为你有一个错字并设置 self.navigationController.view.alpha = 0 而不是 self.navigationController.navigationBar.alpha = 0。我尝试了两种方法,但它并没有达到我所说的效果。 我现在看到您的代码与@E 非常相似。 Lüders,感谢你们的帮助。

以上是关于为啥我的 UINavigationBar 不会动画?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UINavigationbar 被隐藏了?

我正在使用点击事件触发CSS动画,为啥再次点击时动画不会再次运行?

为啥我的 collectionview 单元格没有动画?

为啥我的左右移动动画不起作用?

如何隐藏 UINavigationBar 和 UITabBar 动画?

iOS:删除 UINavigationBar 动画