自定义交互式演示过渡

Custom Interactive Presentation Transition

我正在尝试创建一个自定义视图控制器容器,它将在屏幕底部显示一个抽屉,例如 Apple 邮件或音乐应用程序,我希望用户能够点击它来将其转换为全屏,或以交互方式向上滑动以显示内容。

我让抽屉工作,使用 UIPanGestureRecognizer 来滑动它。 我可以通过将内容控制器添加为子控制器、将内容视图添加到层​​次结构并在适当时调用 viewWillAppear:viewDidAppear: 来实现。

但我希望允许内容视图控制器在滑动的同时进行动画处理(例如 viewWillAppear: 中的任何动画,例如交互式弹出),因此我正在查看自定义模式演示和 UIPercentDrivenInteractiveTransition ,但我碰壁了,我不明白为什么会这样。我已经设置了一个过渡委托,返回一个自定义动画控制器和一个交互控制器,它是一个 UIPercentDrivenInteractiveTransition 对象。

我的抽屉是容器控制器视图层次结构的一部分,自然我希望内容控制器的视图是抽屉的子视图。但是当调用 presentViewController:animated:completion: 时,一个新的 UITransitionView 子视图被添加到 UIWindow,据推测是在过渡动画应该出现的地方。但这会杀死我的 UIPanGestureRecognizer 并且用户无法执行滑动来打开抽屉。

我尝试创建自定义 UIPresentationController 和其他方法来控制此 containerView 在层次结构中的位置,但我无法更改行为。

我尝试做的是正确的方法吗?我错过了什么?


如果有人感兴趣,这是我的框架:LNPopupController

更新2015.11.19

还有一个演示项目

Obj-C -> https://github.com/saiday/DraggableViewControllerDemo

Swift 2.x -> https://github.com/ostatnicky/DraggableViewController

Swift 4.x -> https://github.com/satishVekariya/DraggableViewController

谢谢 @avdyushin 提到我的博客 post。

是的,我的 post Draggable view controller? Interactive view controller! 是关于您主题的教程。

转自我的博客post:

怎么做

设计理念

没有两个 UIViewController 在一起,而是一次只有一个 UIViewController。当用户开始拖动某个子视图时,显示另一个具有自定义 UIViewControllerAnimatedTransitioning by custom UIPercentDrivenInteractiveTransition protocol.

的视图控制器 技术的东西

这两个协议是自定义交互 UIViewController 转换的基础。如果您还不知道,请先看一眼再开始。
1. UIViewControllerAnimatedTransitioning protocol
2. UIPercentDrivenInteractiveTransition protocol

iOS 10 的更新答案:现在使用 UIViewPropertyAnimator.

很简单

UIViewPropertyAnimator 是基于块的动画概念的延续,采用其逻辑延续 - 面向对象的动画包装器。这允许更多的控制,例如使用 fractionComplete 控制动画的完成 - 这正是这里所需要的。