在 iOS 7 中维护导航动画

Posted

技术标签:

【中文标题】在 iOS 7 中维护导航动画【英文标题】:Maintaining navigation animation in iOS 7 【发布时间】:2013-10-21 19:19:52 【问题描述】:

ios 中的UITableViewController 包含一个用于行选择的微妙动画,在返回视图时(通过后退按钮),先前选择的行会短暂突出显示。这为用户提供了应用中的位置感。

对于UIViewControllers,这种行为不是免费的。包含的简单方法是手动取消选择viewWillAppear 中的选定行。

但是,iOS 7 允许用户在导航堆栈中向后“拖动”。部分拖动但未完成拖动操作将触发viewWillAppear 并取消选择该行。当用户真实返回时,该行没有被选中。

使用viewDidAppear 肯定会解决这个问题,但动画是稍后触发的(很明显),让应用感觉迟钝。

有没有人想出办法解决这个问题?

【问题讨论】:

【参考方案1】:

我自己一直在考虑解决方案。例如,当您查看本机邮件应用程序实现的行为时,如果您单击后退按钮,取消选择动画在viewDidAppear 之前开始,但它也不在viewWillAppear 中,因为那时动画非常快并且不以交互方式关闭时突然。但是,当您在viewWillAppear 上以交互方式关闭和取消选择时,单元格会随着手指手势逐渐取消选择,就像本机邮件应用程序一样。似乎viewWillAppear 在动画块内部被调用。 通过实验,viewWillAppear 中的performSelector:@selector(deselect) afterDelay:0 在单击返回动画时会产生所需的动画。

总结一下,当用户点击返回按钮时:performSelector:@selector(deselect) afterDelay:0 in viewWillAppear;当用户交互滑动以关闭时,deselect in viewWillAppear

那么如何区分这两种情况呢? viewWillAppear 中的信息肯定不够。 现在,可以实现导航控制器委托方法,向表格视图控制器发出一个交互式弹出即将开始的信号(在viewWillAppear 之前),然后将其交给Apple 的常规交互式弹出交互控制器。捕获? _interactionController 是私有 API。傻傻的苹果。

然后我发现您可以将UINavigationController 提供给它的interactivePopGestureRecognizer。所以你可以坐在中间,听委托方法,给你的表格视图控制器发信号,并为手势识别器调用苹果的委托实现。

这应该足以让您继续前进。可能是UITableViewController上面的一个可选协议和类别,然后测试弹出到表视图控制器实例是否响应信号方法。当然也可以是子类。

【讨论】:

以上是关于在 iOS 7 中维护导航动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 导航栏在翻转水平 Segue 上跳转

在多个情节提要上维护导航栏?

带有 UINavigationController 的 iOS 7 自定义当前转换

Next.js 在屏幕之间导航时维护路由

ios-如何在项目中添加导航控制器?

具有清晰背景的 Segue 推送动画在 iOS 7 上闪烁