【问题标题】:Allow user interaction during UINavigationController push/pop transition在 UINavigationController 推送/弹出转换期间允许用户交互
【发布时间】:2018-12-21 20:44:41
【问题描述】:

由于我们无法控制推送/弹出时的动画调用(即使通过子类化UINavigationController),我们不能使用UIView.animate 方法的.allowUserInteraction 选项。

但是在查看private headers 之后,我发现Apple 确实通过提供私有API 和私有标志(allowUserInteractionDuringTransition) 想到了这个用例(至少从iOS 8 开始)。所以必须有一种方法可以让导航控制器允许用户交互。

怎么办??

【问题讨论】:

  • 我不需要/不想。我希望实际动画是默认动画,但我希望用户交互在 n-1 控制器上工作,控制器 n 被弹出。

标签: ios swift iphone-privateapi


【解决方案1】:

您为什么要为此使用私有 API?

您可以通过公共UIViewControllerTransitioningDelegate API 实现交互式推送和弹出转换。它非常简单,并且免费提供大部分交互功能,只要您使用UIView.animate* 方法即可。 UIPercentDrivenInteractiveTransition 消除了大部分困难,您甚至可以使用UIDynamicAnimator 获得酷炫的流体效果。

您可以通过这种方式轻松实现系统转换。无论如何,您都可以通过滑动返回免费获得弹出过渡 - 您只需要推送。

这里有一些例子:

https://theswiftdev.com/2018/04/26/ios-custom-transition-tutorial-in-swift/

https://www.raywenderlich.com/322-custom-uiviewcontroller-transitions-getting-started

https://github.com/marcosgriselli/EasyTransitions

还有我个人最喜欢的:

https://github.com/lkzhao/ElasticTransition

如果您想要实现公共 API 未涵盖的更具体的目标,也许您可​​以向我们提供一些代码?

【讨论】:

    【解决方案2】:

    我不确定通过使用下面的代码,你是否能够实现你想要的任何东西。但是,我知道如何拨打private-apis。这是一种调用相同的方法。

    let selector = Selector("allowUserInteractionDuringTransition")
    self.navigationController?.perform(selector, with: true);
    

    如果上述方法不起作用,请尝试将选择器名称更改为 setAllowUserInteractionDuringTransition

    希望这个对你有用。

    【讨论】:

    • @apouche 我已经告诉过你......我不确定它是否有效。但我 100% 确定以这种方式调用私有 API。可能allowUserInteractionDuringTransition 这个变量不是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2014-08-22
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多