|
//
// FFAnimationTransitioning.swift
// FFAlert
//
// Created by FFIB on 2017/11/13.
// Copyright © 2017年 FFIB. All rights reserved.
//
import UIKit
class FFAnimationTransitioning: NSObject, UIViewControllerAnimatedTransitioning {
private var isPresentation = false
private let initialScale: CGFloat = 1.2
private let springDamping: CGFloat = 45.71
private let springVelocity: CGFloat = 0
init(presentation: Bool) {
self.isPresentation = presentation
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromController = transitionContext.viewController(forKey: .from),
let toController = transitionContext.viewController(forKey: .to),
let fromView = fromController.view,
let toView = toController.view else {
return
}
if isPresentation {
transitionContext.containerView.addSubview(toView)
}
let animatingController = isPresentation ? toController : fromController
let animatingView = animatingController.view
animatingView?.frame = transitionContext.finalFrame(for: animatingController)
if isPresentation {
animatingView?.transform = CGAffineTransform(scaleX: initialScale, y: initialScale)
animatingView?.alpha = 0
animate({
animatingView?.transform = CGAffineTransform(scaleX: 1, y: 1)
animatingView?.alpha = 1
}, context: transitionContext, withCompletion: { (finished) in
transitionContext.completeTransition(finished)
})
} else {
animate({
animatingView?.alpha = 0
}, context: transitionContext, withCompletion: { (finished) in
fromView.removeFromSuperview()
transitionContext.completeTransition(finished)
})
}
}
private func animate(_ animations: @escaping (() -> Void),
context: UIViewControllerContextTransitioning,
withCompletion completion: @escaping ((Bool) -> Void)) {
UIView.animate(withDuration: transitionDuration(using: context),
delay: 0,
usingSpringWithDamping: springDamping,
initialSpringVelocity: springVelocity,
options: [],
animations: animations,
completion: completion)
}
}
|