自定义交互式演示过渡
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
控制动画的完成 - 这正是这里所需要的。
我正在尝试创建一个自定义视图控制器容器,它将在屏幕底部显示一个抽屉,例如 Apple 邮件或音乐应用程序,我希望用户能够点击它来将其转换为全屏,或以交互方式向上滑动以显示内容。
我让抽屉工作,使用 UIPanGestureRecognizer
来滑动它。
我可以通过将内容控制器添加为子控制器、将内容视图添加到层次结构并在适当时调用 viewWillAppear:
和 viewDidAppear:
来实现。
但我希望允许内容视图控制器在滑动的同时进行动画处理(例如 viewWillAppear:
中的任何动画,例如交互式弹出),因此我正在查看自定义模式演示和 UIPercentDrivenInteractiveTransition
,但我碰壁了,我不明白为什么会这样。我已经设置了一个过渡委托,返回一个自定义动画控制器和一个交互控制器,它是一个 UIPercentDrivenInteractiveTransition
对象。
我的抽屉是容器控制器视图层次结构的一部分,自然我希望内容控制器的视图是抽屉的子视图。但是当调用 presentViewController:animated:completion:
时,一个新的 UITransitionView
子视图被添加到 UIWindow
,据推测是在过渡动画应该出现的地方。但这会杀死我的 UIPanGestureRecognizer
并且用户无法执行滑动来打开抽屉。
我尝试创建自定义 UIPresentationController
和其他方法来控制此 containerView
在层次结构中的位置,但我无法更改行为。
我尝试做的是正确的方法吗?我错过了什么?
如果有人感兴趣,这是我的框架:LNPopupController
还有一个演示项目
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
控制动画的完成 - 这正是这里所需要的。