最近在研究微信小程序的入场和出场动画所以对这块进行了调研,总结一些踩过的坑
一.model转场动画Present\Dismiss。
1 | 转场代理 |
1 | // 展示的动画 |
二.UINavigationControllerDelegate,Pop 和 Push 的自定义动画。
1 |
|
三.手势交互,主要类是UIPercentDrivenInteractiveTransition
1 | - (void)onPan:(UIPanGestureRecognizer *)pan { |
四.动画实现类,UIViewControllerAnimatedTransitioning
1 | // 动画时间 |
具体代码
1 | - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext |
一些注意:
1.在动画结束后我们必须向context报告VC切换完成,是否成功(在这里的动画切换中,没有失败的可能性,因此直接pass一个YES过去)。系统在接收到这个消息后,将对VC状态进行维护。
2.尽量使用系统提供的方法finalFrameForViewController
来确定位置,由于 iOS11和iOS10等系统对转场动画结束的处理方式不一致,在手势驱动结束和取消的时候进行动画的还原
否则会出现莫名其妙的 bug,例如黑屏,
1 | -(CGRect)initialFrameForViewController:(UIViewController *)vc; 某个VC的初始位置,可以用来做动画的计算。 |
问题:
1.目前发现在iOS9.0模拟器表现不正确,目前最新已经是 ios12Beta,未找到真机测试,测试了几个比较好,都有这个问题,在这里推荐一个比较好的库VCTransitionsLibrary
2.还有就是在手势滑动结束的时候,动画会闪动,然后变成正常的位置,转场动画尽量添加到containerView,进行否则会出现莫名其妙的的 bug,使用下面代码,尝试去解决
1 | /** |
手势驱动结束滑动之后,剩余距离的速度1
2
3
4
5
6
7/**
手势最后的运动速度
@return 速度值
*/
- (CGFloat)completionSpeed {
return 1 - self.percentComplete;
}
里面很多没有整理
demo