11

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

在此处输入图像描述

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

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

我的抽屉是容器控制器视图层次结构的一部分,自然我希望内容控制器的视图成为抽屉的子视图。但是在调用 时presentViewController:animated:completion:,会在 中添加一个新的UITransitionView子视图UIWindow,据说应该在哪里发生过渡动画。但这会杀死我UIPanGestureRecognizer,并且用户无法执行滑动以打开抽屉。

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

我正在尝试做正确的事情吗?我错过了什么?


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

4

2 回答 2

6
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提到了我的博文。

是的,我的帖子可拖动视图控制器?交互式视图控制器!是一个关于你的主题的教程。

引用自我的博文:

怎么做

设计理念

没有两个UIViewController在一起,而是一次只有一个UIViewController。当用户开始拖动某个子视图时,通过自定义UIPercentDrivenInteractiveTransition 协议呈现另一个具有自定义UIViewControllerAnimatedTransitioning的视图控制器。

技术的东西

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

于 2015-10-26T14:25:46.927 回答
5

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

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

于 2016-12-28T16:03:55.187 回答