IOS实战之自定义转场动画详解

2020-01-14 20:18:51丽君

animator中的代码略去,它和非交互式动画中的animator类似。因为交互式的动画只是一种锦上添花,它必须支持非交互式的动画,比如这个例子中,点击按钮依然出发的是非交互式的动画,只是手势滑动才会触发交互式动画。


class TransitionInteractionController: UIPercentDrivenInteractiveTransition {
  /// 当手势有滑动时触发这个函数
  func gestureRecognizeDidUpdate(gestureRecognizer: UIScreenEdgePanGestureRecognizer) {
    switch gestureRecognizer.state {
    case .Began: break
    case .Changed: self.updateInteractiveTransition(self.percentForGesture(gestureRecognizer)) //手势滑动,更新百分比
    case .Ended:  // 滑动结束,判断是否超过一半,如果是则完成剩下的动画,否则取消动画
      if self.percentForGesture(gestureRecognizer) >= 0.5 {
        self.finishInteractiveTransition()
      }
      else {
        self.cancelInteractiveTransition()
      }
    default: self.cancelInteractiveTransition()
    }
  }
  private func percentForGesture(gesture: UIScreenEdgePanGestureRecognizer) -> CGFloat {
    let percent = 根据gesture计算得出
    return percent
  }
}

交互式动画是在非交互式动画的基础上实现的,我们需要创建一个继承自UIPercentDrivenInteractiveTransition类型的子类,并且在动画代理中返回这个类型的实例对象。

在这个类型中,监听手势(或者下载进度等等)的时间变化,然后调用percentForGesture方法更新动画进度即可。

转场协调器与UIModalPresentationCustom
在进行转场动画的同时,您还可以进行一些同步的,额外的动画,比如文章开头gif中的第三个例子。presentedView和presentingView可以更改自身的视图层级,添加额外的效果(阴影,圆角)。UIKit使用转成协调器来管理这些额外的动画。您可以通过需要产生动画效果的视图控制器的transitionCoordinator属性来获取转场协调器,转场协调器只在转场动画的执行过程中存在。

IOS实战之自定义转场动画详解

想要完成gif中第三个例子的效果,我们还需要使用UIModalPresentationStyle.Custom来代替.FullScreen。因为后者会移除fromViewController,这显然不符合需求。

当present的方式为.Custom时,我们还可以使用UIPresentationController更加彻底的控制转场动画的效果。一个 presentation controller具备以下几个功能: