效果图
项目地址:ImageMaskTransition
转场原理
对于模态展示(Modal)
iOS 8之后,可以通过设置ViewController的转场代理
transitioningDelegate
这个转场代理是一个协议类型UIViewControllerTransitioningDelegate
.由于我们是非交互式转场,所以只需要实现协议的两个方法即可
// MARK: - UIViewControllerTransitioningDelegate -
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//这里返回present的动画
}
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//这里返回dismiss的动
}
对于NavigationController来说,则可以设置NavigationController的delegate来返回自定义的动画。
navigationController.delegate
这里的delegate
是UINavigationControllerDelegate
类型,在不考虑交互式转场的情况下,我们只需要实现以下方法即可
//返回动画
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
switch operation {
case .Pop:
//返回Pop时候
case .Push:
//返回Push时候的动画
default:
return nil
}
}
细心的朋友应该发现了,不管是模态还是Push,都是返回一个UIViewControllerAnimatedTransitioning
协议类型的对象
通用的Animator
定义一个类,让其遵循UIViewControllerAnimatedTransitioning
协议,来实现实际的动画,
class ImageMaskAnimator: NSObject,UIViewControllerAnimatedTransitioning {}
由于实现了UIViewControllerAnimatedTransitioning
协议,所以要提供两个方法
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
//这里返回动画的时间
}
func