看了一些网上的实现效果,主要是悬浮窗的,转场动画都没能做到微信的效果。作为完美主义者,还是觉得有所欠缺,于是想着就自己做吧 。另外也是对转场动画做的比较多,做一个总结。
效果图
说明
侧滑动画结束后展示悬浮球没有做,一个是不属于转场动画,二个是已经有不错的实现效果了。如果有自己的悬浮窗实现,想添加进去,该库也有相应的协议支持扩展。
该库的目的做成一个方便扩展,低耦合的转场和侧滑动画的库, 后面会添加对present的支持,以及会增加更多的动画效果。
使用介绍
1. 设置UINavigationController delegate
class NavigationController: UINavigationController {
// 微信悬浮窗效果的转场动画控制器
let floatingControl: FloatingKeeperControl = {
let control = FloatingKeeperControl()
// 设定需要动画效果
// control.floatingTransitionProducer.underAnimationType =
// control.floatingTransitionProducer.uponAnimationType =
return control
}()
override func viewDidLoad() {
super.viewDidLoad()
// 设定好转场动画控制器之后,设置为UINavigationController 的delegate
// 若已设置, 则需要实现NavigationInteractiveControlType,并
// 重写 navigationController(_:animationControllerFor:from:to:) 和 navigationController(_:interactionControllerFor:)方法,
// 可参照 GeneralTransitionControl
delegate = floatingControl
}
}
2. 添加自定义侧滑效果
override func viewDidLoad() {
super.viewDidLoad()
/// 默认的手势是左侧,向右侧滑。
/// 如果你的设置的Transition动画是从左侧push,则这里设定为.right
if let gesture = self.lm.interactivePop(.left) {
view.addGestureRecognizer(gesture)
}
}
3. 实现协议 FloatingKeepAble
// FloatingKeepAble 协议不需要额外实现,只需要添加给需要触发 UIViewController即可
// 该协议用于微信浮窗效果。只需要转场和侧滑动画只需要1和2即可
class FloatingAbleViewController: UIViewController, FloatingKeepAble {
// your implement
}
设计思路
主要是3个协议
- NavigationInteractiveControlType: 管理下面两个工厂类。并可以方便的组合和替换他们
- InteractiveProducerType: 生成侧滑动画UIViewControllerInteractiveTransitioning对象
- AniTransitionProducerType: 生成转场动画UIViewControllerAnimatedTransitioning对象
Tips
已有悬浮球的实现,想添加进去,做成完整的浮窗效果。可以实现FloatingBarManagerType 协议。然后调用下面的方法
FloatingKeeperManager.shared.floatingBarManager = your floating bar manager