获取 UINavigationBar 委托以允许“返回”,并带有漂亮的动画

Posted

技术标签:

【中文标题】获取 UINavigationBar 委托以允许“返回”,并带有漂亮的动画【英文标题】:Get UINavigationBar delegate to allow "back", with a nice animation 【发布时间】:2012-05-10 21:47:49 【问题描述】:

iPhone 上的场景:

用户点击返回按钮,UINavigationBar委托方法(在UINavigationController的子类中实现)返回YES,如下所示:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item

    // Verify stuff...

    return YES;

现在,根据docs,保持导航栏和内容同步是应用程序的责任,而这样做的地方是在委托方法中

- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item

问题是,didPopItem 仅在导航栏的弹出动画序列完成后调用,所以如果我在那里调用[self popViewControllerAnimated: NO],最终结果是导航栏首先滑回,然后是内容。

这看起来不对。

如果我在委托shouldPop... 方法中调用导航控制器的pop...,我会收到一条错误消息,大意是我正在重叠动画,并且最终状态不干净。

所以我的问题是,是否有另一种方法可以让 UINavigationController 更改内容,最好使用与导航栏同步的漂亮动画,但不会在导航栏和导航控制器之间造成混淆?

目标操作系统是 ios 4.2 及更高版本。

我知道我可以创建另一个左按钮来代替后退按钮,但我发现使用委托更简洁,此外,我得到了一个“真正的”后退按钮,这正是我想要的。

【问题讨论】:

你想在导航栏的弹出动画序列之前调用 didPopItem 方法,因为你在第 3 段中有作者。你想做什么,你能说明一下你的第 3 段,你认为你的主要问题 为什么要使用带有UINavigationController 的单独导航栏而不是使用它提供的导航栏? 【参考方案1】:

如果您使用的是 UINavigationController,则无需自己管理。只需使用 UINavigationController,您就可以省去很多麻烦。它将负责弹出内容视图以及导航栏项目。

【讨论】:

【参考方案2】:

试试这个:

假设您有 viewControllerA 和 viewControllerB。 viewControllerA 是第一个,不需要导航栏,而 viewControllerB 需要。

在viewControllerA的方法viewWillAppear上放代码:

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

当弹出 viewControllerB 时,您会使用动画。两个动画将自动同步。

不知道这对iOS4.2是否有效

【讨论】:

以上是关于获取 UINavigationBar 委托以允许“返回”,并带有漂亮的动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS 获取 UINavigationBar 的后退按钮以设置辅助功能属性

如何向 UINavigationBar 添加后退按钮?

带有 RECurtainViewController 的 UINavigationBar 外观

UINavigationBar.titleTextAttributes 支持哪些属性?

UINavigationBar 在 PushViewController 上隐藏 UIBarButtons

如何为 UINavigationBar 设置不透明的 1px 高阴影图像?