Commit e7710088 by Daniel Dahan

development: added x and y MotionAnimation enum values

parent 41f34e42
......@@ -50,6 +50,8 @@ public enum MotionAnimationKeyPath: String {
case shadowPath
case opacity
case zPosition
case width = "bounds.size.width"
case height = "bounds.size.height"
}
public enum MotionAnimation {
......@@ -76,10 +78,14 @@ public enum MotionAnimation {
case translateX(CGFloat)
case translateY(CGFloat)
case translateZ(CGFloat)
case x(CGFloat)
case y(CGFloat)
case position(x: CGFloat, y: CGFloat)
case shadow(path: CGPath)
case fade(CGFloat)
case zPosition(Int)
case width(CGFloat)
case height(CGFloat)
}
extension CALayer {
......@@ -159,11 +165,17 @@ extension CALayer {
fileprivate func motion(delay: TimeInterval, duration: TimeInterval, timingFunction: MotionAnimationTimingFunction, animations: [MotionAnimation]) {
var t = delay
var w: CGFloat = 0
var h: CGFloat = 0
for v in animations {
switch v {
case let .delay(time):
t = time
case let .width(width):
w = width
case let .height(height):
h = height
default:break
}
}
......@@ -223,6 +235,10 @@ extension CALayer {
a.append(Motion.translateY(to: to))
case let .translateZ(to):
a.append(Motion.translateZ(to: to))
case let .x(x):
a.append(Motion.position(to: CGPoint(x: x + w / 2, y: s.position.y)))
case let .y(y):
a.append(Motion.position(to: CGPoint(x: s.position.x, y: y + h / 2)))
case let .position(x, y):
a.append(Motion.position(to: CGPoint(x: x, y: y)))
case let .shadow(path):
......@@ -235,6 +251,10 @@ extension CALayer {
let zPosition = Motion.zPosition(index: index)
zPosition.fromValue = s.value(forKey: MotionAnimationKeyPath.zPosition.rawValue) ?? NSNumber(integerLiteral: 0)
a.append(zPosition)
case let .width(w):
a.append(Motion.width(w))
case let .height(h):
a.append(Motion.height(h))
default:break
}
}
......@@ -538,4 +558,26 @@ extension Motion {
animation.toValue = NSNumber(integerLiteral: index)
return animation
}
/**
Creates a CABasicaAnimation for the width key path.
- Parameter width: A CGFloat.
- Returns: A CABasicAnimation.
*/
public static func width(_ width: CGFloat) -> CABasicAnimation {
let animation = CABasicAnimation(keyPath: .width)
animation.toValue = NSNumber(floatLiteral: Double(width))
return animation
}
/**
Creates a CABasicaAnimation for the height key path.
- Parameter height: A CGFloat.
- Returns: A CABasicAnimation.
*/
public static func height(_ height: CGFloat) -> CABasicAnimation {
let animation = CABasicAnimation(keyPath: .height)
animation.toValue = NSNumber(floatLiteral: Double(height))
return animation
}
}
......@@ -84,6 +84,7 @@ open class MotionTransitionViewController: UIViewController {
when subclassing.
*/
open func prepare() {
modalPresentationStyle = .custom
transitioningDelegate = transitionDelegate
}
}
......@@ -126,8 +127,26 @@ open class MotionTransitionPresentationController: UIPresentationController {
return
}
print(presentedViewController)
print("Presented")
// for v in presentedViewController.view.subviews {
// if 0 < v.transitionIdentifier.utf16.count {
// print(v.transitionAnimations)
// v.motion(v.transitionAnimations)
// }
// }
presentedViewController.transitionCoordinator?.animate(alongsideTransition: { (context) in
print("Animating")
})
print("presentationTransitionWillBegin")
}
open override func presentationTransitionDidEnd(_ completed: Bool) {
print("presentationTransitionDidEnd")
}
open override var frameOfPresentedViewInContainerView: CGRect {
return containerView?.bounds ?? .zero
}
}
......@@ -148,34 +167,7 @@ open class MotionTransitionDelegate: NSObject {
@objc(animateTransition:)
open func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let tView = transitionContext.view(forKey: .to) else {
return
}
guard let tVC = transitionContext.viewController(forKey: .to) else {
return
}
guard let fView = transitionContext.view(forKey: .from) else {
return
}
guard let fVC = transitionContext.viewController(forKey: .from) else {
return
}
self.transitionContext = transitionContext
containerView = transitionContext.containerView
toView = tView
toViewController = tVC
fromView = fView
fromViewController = fVC
toViewStartFrame = transitionContext.initialFrame(for: toViewController)
toViewFinalFrame = transitionContext.finalFrame(for: toViewController)
fromViewFinalFrame = transitionContext.finalFrame(for: fromViewController)
}
@objc(transitionDuration:)
......@@ -198,11 +190,11 @@ extension MotionTransitionDelegate: UIViewControllerTransitioningDelegate {
}
open func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return MotionTransitionInteractiveAnimator()
return nil // MotionTransitionInteractiveAnimator()
}
open func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return MotionTransitionInteractiveAnimator()
return nil // MotionTransitionInteractiveAnimator()
}
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
......@@ -329,7 +321,58 @@ extension MotionTransitionInteractiveDelegate {
open class MotionTransitionAnimator: MotionTransitionDelegate, UIViewControllerAnimatedTransitioning {
@objc(animateTransition:)
open override func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
super.animateTransition(using: transitionContext)
// guard let tView = transitionContext.view(forKey: .to) else {
// return
// }
guard let tVC = transitionContext.viewController(forKey: .to) else {
return
}
// guard let fView = transitionContext.view(forKey: .from) else {
// return
// }
guard let fVC = transitionContext.viewController(forKey: .from) else {
return
}
self.transitionContext = transitionContext
containerView = transitionContext.containerView
// toView = tView
toViewController = tVC
// fromView = fView
fromViewController = fVC
toViewStartFrame = transitionContext.initialFrame(for: toViewController)
toViewFinalFrame = transitionContext.finalFrame(for: toViewController)
fromViewFinalFrame = transitionContext.finalFrame(for: fromViewController)
var duration = transitionDuration(using: nil)
transitionContext.containerView.addSubview(toViewController.view)
for v in toViewController.view.subviews {
if 0 < v.transitionIdentifier.utf16.count {
for a in v.transitionAnimations {
switch a {
case let .duration(dur):
if dur > duration {
duration = dur
}
default:break
}
}
v.motion(v.transitionAnimations)
}
}
Motion.delay(duration) {
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
}
open class MotionTransitionInteractiveAnimator: MotionTransitionInteractiveDelegate {
......@@ -355,9 +398,9 @@ open class FadeMotionTransition: NSObject, UIViewControllerAnimatedTransitioning
transitionContext.containerView.addSubview(toView)
UIView.animate(withDuration: transitionDuration(using: transitionContext),
animations: { _ in
toView.alpha = 1
fromView.alpha = 0
animations: { _ in
toView.alpha = 1
fromView.alpha = 0
}) { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment