111 lines
3.3 KiB
Swift
111 lines
3.3 KiB
Swift
|
//
|
||
|
// ImageTransition.swift
|
||
|
// Multiplatform iOS
|
||
|
//
|
||
|
// Created by Maurice Parker on 7/6/20.
|
||
|
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
|
||
|
class ImageTransition: NSObject, UIViewControllerAnimatedTransitioning {
|
||
|
|
||
|
private weak var webViewController: WebViewController?
|
||
|
private let duration = 0.4
|
||
|
var presenting = true
|
||
|
var originFrame: CGRect!
|
||
|
var maskFrame: CGRect!
|
||
|
var originImage: UIImage!
|
||
|
|
||
|
init(controller: WebViewController) {
|
||
|
self.webViewController = controller
|
||
|
}
|
||
|
|
||
|
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
|
||
|
return duration
|
||
|
}
|
||
|
|
||
|
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||
|
if presenting {
|
||
|
animateTransitionPresenting(using: transitionContext)
|
||
|
} else {
|
||
|
animateTransitionReturning(using: transitionContext)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private func animateTransitionPresenting(using transitionContext: UIViewControllerContextTransitioning) {
|
||
|
|
||
|
let imageView = UIImageView(image: originImage)
|
||
|
imageView.frame = originFrame
|
||
|
|
||
|
let fromView = transitionContext.view(forKey: .from)!
|
||
|
fromView.removeFromSuperview()
|
||
|
|
||
|
transitionContext.containerView.backgroundColor = .systemBackground
|
||
|
transitionContext.containerView.addSubview(imageView)
|
||
|
|
||
|
webViewController?.hideClickedImage()
|
||
|
|
||
|
UIView.animate(
|
||
|
withDuration: duration,
|
||
|
delay:0.0,
|
||
|
usingSpringWithDamping: 0.8,
|
||
|
initialSpringVelocity: 0.2,
|
||
|
animations: {
|
||
|
let imageController = transitionContext.viewController(forKey: .to) as! ImageViewController
|
||
|
imageView.frame = imageController.zoomedFrame
|
||
|
}, completion: { _ in
|
||
|
imageView.removeFromSuperview()
|
||
|
let toView = transitionContext.view(forKey: .to)!
|
||
|
transitionContext.containerView.addSubview(toView)
|
||
|
transitionContext.completeTransition(true)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
private func animateTransitionReturning(using transitionContext: UIViewControllerContextTransitioning) {
|
||
|
let imageController = transitionContext.viewController(forKey: .from) as! ImageViewController
|
||
|
let imageView = UIImageView(image: originImage)
|
||
|
imageView.frame = imageController.zoomedFrame
|
||
|
|
||
|
let fromView = transitionContext.view(forKey: .from)!
|
||
|
let windowFrame = fromView.window!.frame
|
||
|
fromView.removeFromSuperview()
|
||
|
|
||
|
let toView = transitionContext.view(forKey: .to)!
|
||
|
transitionContext.containerView.addSubview(toView)
|
||
|
|
||
|
let maskingView = UIView()
|
||
|
|
||
|
let fullMaskFrame = CGRect(x: windowFrame.minX, y: maskFrame.minY, width: windowFrame.width, height: maskFrame.height)
|
||
|
let path = UIBezierPath(rect: fullMaskFrame)
|
||
|
let maskLayer = CAShapeLayer()
|
||
|
maskLayer.path = path.cgPath
|
||
|
maskingView.layer.mask = maskLayer
|
||
|
|
||
|
maskingView.addSubview(imageView)
|
||
|
transitionContext.containerView.addSubview(maskingView)
|
||
|
|
||
|
UIView.animate(
|
||
|
withDuration: duration,
|
||
|
delay:0.0,
|
||
|
usingSpringWithDamping: 0.8,
|
||
|
initialSpringVelocity: 0.2,
|
||
|
animations: {
|
||
|
imageView.frame = self.originFrame
|
||
|
}, completion: { _ in
|
||
|
if let controller = self.webViewController {
|
||
|
controller.showClickedImage() {
|
||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||
|
imageView.removeFromSuperview()
|
||
|
transitionContext.completeTransition(true)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
imageView.removeFromSuperview()
|
||
|
transitionContext.completeTransition(true)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
}
|