我正在尝试创建一个自定义视图控制器容器,它将在屏幕底部显示一个抽屉,如Apple邮件或音乐应用程序,我希望用户能够点击它来转换它全屏,或以交互方式向上滑动以显示内容。
我让抽屉工作,使用UIPanGestureRecognizer
滑动它。
我可以通过将内容控制器添加为子控制器,将内容视图添加到层次结构并在适当时调用viewWillAppear:
和viewDidAppear:
来实现此目的。
但是我希望允许内容视图控制器在滑动旁边进行动画处理(例如viewWillAppear:
中的任何动画,就像交互式弹出一样),因此我正在查看自定义模式演示和UIPercentDrivenInteractiveTransition
,但是我正在撞墙,我不明白为什么会发生这种情况。我已经设置了一个转换委托,返回一个自定义动画控制器和一个UIPercentDrivenInteractiveTransition
对象的交互控制器。
我的抽屉是容器控制器视图层次结构的一部分,当然我希望内容控制器的视图是抽屉的子视图。但是在调用presentViewController:animated:completion:
时,会向UITransitionView
添加一个新的UIWindow
子视图,据推测应该是转换动画发生的位置。但这会导致我的UIPanGestureRecognizer
被杀,用户无法执行滑动以打开抽屉。
我尝试创建自定义UIPresentationController
以及其他方法来控制层次结构中containerView
应该在哪里,但我无法更改行为。
我试图以正确的方式做什么?我错过了什么?
如果有人有兴趣,这是我的框架:LNPopupController
答案 0 :(得分:6)
一个演示项目
Obj-C - > https://github.com/saiday/DraggableViewControllerDemo
Swift 2.x - > https://github.com/ostatnicky/DraggableViewController
Swift 4.x - > https://github.com/satishVekariya/DraggableViewController
感谢@avdyushin提到我的博文。
是的,我的帖子Draggable view controller? Interactive view controller!是一个关于你主题的教程。
引自我的博文:
一起没有两个UIViewController
,而一次只有一个UIViewController
。当用户开始拖动某个子视图时,按自定义UIViewControllerAnimatedTransitioning显示另一个包含自定义UIPercentDrivenInteractiveTransition protocol的视图控制器。
这两个协议是自定义交互式UIViewController
转换的基础。如果您还不知道,请在开始之前先看一眼
1. UIViewControllerAnimatedTransitioning protocol
2. UIPercentDrivenInteractiveTransition protocol
答案 1 :(得分:4)
iOS 10的更新答案:现在使用UIViewPropertyAnimator
微不足道了。
UIViewPropertyAnimator
是基于块的动画概念的延续,采用了它的逻辑延续 - 围绕动画的面向对象的包装。这允许更多的控制,例如使用fractionComplete
控制动画的完成 - 正是这里所需要的。