func prepareView() {
view.backgroundColor = UIColor.white
view.layer.cornerRadius = 10
view.layer.masksToBounds = true
let tap = UITapGestureRecognizer(target: self, action: #selector(self.didTapTransitioningBackgroundView))
transitioningBackgroundView.addGestureRecognizer(tap)
transitioningBackgroundView.isUserInteractionEnabled = true
}
@objc func didTapTransitioningBackgroundView() {
didTapCancel()
}
func prepareLayout() {
guard let navBar = navBar,
let collectionView = collectionView else {
return
}
navBar.autoPinEdge(toSuperviewEdge: .top)
navBar.autoPinEdge(toSuperviewEdge: .leading)
navBar.autoPinEdge(toSuperviewEdge: .trailing)
navBar.autoSetDimension(.height, toSize: 44)
collectionView.autoPinEdge(.top, to: .bottom, of: navBar)
collectionView.autoPinEdge(toSuperviewEdge: .leading)
collectionView.autoPinEdge(toSuperviewEdge: .trailing)
collectionView.autoPinEdge(toSuperviewEdge: .bottom)
}
func prepareNavBar() {
let navBar = UINavigationBar(frame: CGRect.zero)
view.addSubview(navBar)
let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
let color = UIColor.white
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
navBar.setBackgroundImage(image, for: .default)
navBar.tintColor = UIColor.black
navBar.isTranslucent = false
self.navigationItem.title = "Category"
navBar.setItems([self.navigationItem], animated: false)
self.navBar = navBar
}
class DropDownPresentTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1.0
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) else {
return
}
guard let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? SUIViewController else {
return
}
let bounds = UIScreen.main.bounds
toViewController.transitioningBackgroundView.backgroundColor = UIColor.darkGray
toViewController.transitioningBackgroundView.alpha = 0.6
toViewController.transitioningBackgroundView.frame = bounds
let containerView = transitionContext.containerView
containerView.addSubview(toViewController.transitioningBackgroundView)
containerView.addSubview(toViewController.view)
let x = floor(bounds.width*0.1)
let y = floor(bounds.height*0.2)
let width = floor(bounds.width*0.8)
let height = floor(bounds.height*0.5) > 400 ? floor(bounds.height*0.5) : 400
let finalFrameForVC = CGRect(x: x, y: y, width: width, height: height)
let xOffset: CGFloat = 0
let yOffset = -bounds.size.height
toViewController.view.frame = finalFrameForVC.offsetBy(dx: xOffset, dy: yOffset)
let options = UIViewAnimationOptions.curveEaseIn
UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: options, animations: {
fromViewController.view.alpha = 0.8
toViewController.view.frame = finalFrameForVC
}, completion: {
finished in
transitionContext.completeTransition(true)
})
}
}
class DropDownDismissTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as? SUIViewController else {
return
}
guard let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else {
return
}
let bounds = UIScreen.main.bounds
let x = fromViewController.view.center.x
let y = bounds.height + fromViewController.view.frame.height / 2
let finalCenter = CGPoint(x: x, y: y)
let options = UIViewAnimationOptions.curveEaseIn
UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: options, animations: {
fromViewController.view.center = finalCenter
fromViewController.transitioningBackgroundView.alpha = 0
toViewController.view.alpha = 1
}, completion: {
finished in
fromViewController.view.removeFromSuperview()
transitionContext.completeTransition(true)
})
}
}
class PopoverTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1.0
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) else {
return
}
guard let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? SUIViewController else {
return
}
let bounds = UIScreen.main.bounds
toViewController.transitioningBackgroundView.backgroundColor = UIColor.darkGray
toViewController.transitioningBackgroundView.alpha = 0.6
toViewController.transitioningBackgroundView.frame = bounds
let containerView = transitionContext.containerView
containerView.addSubview(toViewController.transitioningBackgroundView)
containerView.addSubview(toViewController.view)
let x = floor(bounds.width*0.1)
let y = floor(bounds.height*0.2)
let width = floor(bounds.width*0.8)
let height = floor(bounds.height*0.5) > 400 ? floor(bounds.height*0.5) : 400
let finalFrameForVC = CGRect(x: x, y: y, width: width, height: height)
toViewController.view.frame = finalFrameForVC.offsetBy(dx: 0, dy: bounds.size.height)
let options = UIViewAnimationOptions.curveEaseIn
UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: options, animations: {
fromViewController.view.alpha = 0.8
toViewController.view.frame = finalFrameForVC
}, completion: {
finished in
transitionContext.completeTransition(true)
})
}
}
class PopoverDisMissTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as? SUIViewController else {
return
}
guard let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else {
return
}
let bounds = UIScreen.main.bounds
let x = fromViewController.view.center.x
let y = bounds.height + fromViewController.view.frame.height / 2
let finalCenter = CGPoint(x: x, y: y)
let options = UIViewAnimationOptions.curveEaseIn
UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.2, options: options, animations: {
fromViewController.view.center = finalCenter
fromViewController.transitioningBackgroundView.alpha = 0
toViewController.view.alpha = 1
}, completion: {
finished in
fromViewController.view.removeFromSuperview()
transitionContext.completeTransition(true)
})
}
}