Commit 959610e1 by Daniel Dahan

reworked MotionTransition+MotionStringConvertible

parent 682b0543
......@@ -28,105 +28,130 @@
import UIKit
/// used to construct MotionTransition from motionTransitionsString
extension MotionTransition: MotionStringConvertible {
public static func from(node: ExprNode) -> MotionTransition? {
let name: String = node.name
let parameters: [ExprNode] = (node as? CallNode)?.arguments ?? []
/**
Used to construct MotionTransitions from motionTransitionsString.
- Parameter node: An ExprNode.
- Returns: An optional MotionTransition.
*/
public static func from(node: ExprNode) -> MotionTransition? {
let name: String = node.name
let parameters: [ExprNode] = (node as? CallNode)?.arguments ?? []
switch name {
case "fade":
return .fade
case "opacity":
return MotionTransition.fade(to: parameters.getFloat(0) ?? 1)
case "position":
return .position(to: CGPoint(x: parameters.getCGFloat(0) ?? 0, y: parameters.getCGFloat(1) ?? 0))
case "size":
return .size(CGSize(width: parameters.getCGFloat(0) ?? 0, height: parameters.getCGFloat(1) ?? 0))
case "scale":
if parameters.count == 1 {
return .scale(to: parameters.getCGFloat(0) ?? 1)
} else {
return .scale(x: parameters.getCGFloat(0) ?? 1,
y: parameters.getCGFloat(1) ?? 1,
z: parameters.getCGFloat(2) ?? 1)
}
case "rotate":
if parameters.count == 1 {
return .rotate(parameters.getCGFloat(0) ?? 0)
} else {
return .rotate(x: parameters.getCGFloat(0) ?? 0,
y: parameters.getCGFloat(1) ?? 0,
z: parameters.getCGFloat(2) ?? 0)
}
case "translate":
return .translate(x: parameters.getCGFloat(0) ?? 0,
y: parameters.getCGFloat(1) ?? 0,
z: parameters.getCGFloat(2) ?? 0)
case "overlay":
return .overlay(color: UIColor(red: parameters.getCGFloat(0) ?? 1,
switch name {
case "fade":
return .fade
case "opacity":
return MotionTransition.fade(to: parameters.getFloat(0) ?? 1)
case "position":
return .position(to: CGPoint(x: parameters.getCGFloat(0) ?? 0, y: parameters.getCGFloat(1) ?? 0))
case "size":
return .size(CGSize(width: parameters.getCGFloat(0) ?? 0, height: parameters.getCGFloat(1) ?? 0))
case "scale":
return 1 == parameters.count ? .scale(to: parameters.getCGFloat(0) ?? 1) : .scale(x: parameters.getCGFloat(0) ?? 1,
y: parameters.getCGFloat(1) ?? 1,
z: parameters.getCGFloat(2) ?? 1)
case "rotate":
return 1 == parameters.count ? .rotate(parameters.getCGFloat(0) ?? 0) : .rotate(x: parameters.getCGFloat(0) ?? 0,
y: parameters.getCGFloat(1) ?? 0,
z: parameters.getCGFloat(2) ?? 0)
case "translate":
return .translate(x: parameters.getCGFloat(0) ?? 0,
y: parameters.getCGFloat(1) ?? 0,
z: parameters.getCGFloat(2) ?? 0)
case "overlay":
return .overlay(color: UIColor(red: parameters.getCGFloat(0) ?? 1,
green: parameters.getCGFloat(1) ?? 1,
blue: parameters.getCGFloat(2) ?? 1,
blue: parameters.getCGFloat(2) ?? 1,
alpha: 1),
opacity: parameters.getCGFloat(3) ?? 1)
case "duration":
if let duration = parameters.getDouble(0) {
return .duration(duration)
}
case "preferredDurationMatchesLongest":
return .preferredDurationMatchesLongest
case "delay":
if let delay = parameters.getDouble(0) {
return .delay(delay)
}
case "spring":
if #available(iOS 9, *) {
return .spring(stiffness: parameters.getCGFloat(0) ?? 250, damping: parameters.getCGFloat(1) ?? 30)
}
case "timingFunction":
if let c1 = parameters.getFloat(0),
let c2 = parameters.getFloat(1),
let c3 = parameters.getFloat(2),
let c4 = parameters.getFloat(3) {
return .timingFunction(CAMediaTimingFunction(controlPoints: c1, c2, c3, c4))
} else if let name = parameters.get(0)?.name, let timingFunction = CAMediaTimingFunction.from(mediaTimingFunctionType: name) {
return .timingFunction(timingFunction)
}
case "arc":
return .arc(intensity: parameters.getCGFloat(0) ?? 1)
case "cascade":
var cascadeDirection = CascadeDirection.topToBottom
if let directionString = parameters.get(1)?.name,
let direction = CascadeDirection(directionString) {
cascadeDirection = direction
}
return .cascade(delta: parameters.getDouble(0) ?? 0.02, direction: cascadeDirection, animationDelayUntilMatchedViews:parameters.getBool(2) ?? false)
case "source":
if let motionIdentifier = parameters.get(0)?.name {
return .motionIdentifier(motionIdentifier)
}
case "useGlobalCoordinateSpace":
return .useGlobalCoordinateSpace
case "useSameParentCoordinateSpace":
return .useSameParentCoordinateSpace
case "ignoreSubviewTransitions":
return .ignoreSubviewTransitions(recursive:parameters.getBool(0) ?? false)
case "zPosition":
if let zPosition = parameters.getCGFloat(0) {
return .zPosition(zPosition)
}
case "useOptimizedSnapshot":
return .useOptimizedSnapshot
case "useNormalSnapshot":
return .useNormalSnapshot
case "useLayerRenderSnapshot":
return .useLayerRenderSnapshot
case "useNoSnapshot":
return .useNoSnapshot
case "forceAnimate":
return .forceAnimate
default: break
case "duration":
if let v = parameters.getDouble(0) {
return .duration(v)
}
case "preferredDurationMatchesLongest":
return .preferredDurationMatchesLongest
case "delay":
if let v = parameters.getDouble(0) {
return .delay(v)
}
case "spring":
if #available(iOS 9, *) {
return .spring(stiffness: parameters.getCGFloat(0) ?? 250, damping: parameters.getCGFloat(1) ?? 30)
}
case "timingFunction":
if let c1 = parameters.getFloat(0),
let c2 = parameters.getFloat(1),
let c3 = parameters.getFloat(2),
let c4 = parameters.getFloat(3) {
return .timingFunction(CAMediaTimingFunction(controlPoints: c1, c2, c3, c4))
} else if let name = parameters.get(0)?.name,
let timingFunction = CAMediaTimingFunction.from(mediaTimingFunctionType: name) {
return .timingFunction(timingFunction)
}
case "arc":
return .arc(intensity: parameters.getCGFloat(0) ?? 1)
case "cascade":
var cascadeDirection = CascadeDirection.topToBottom
if let directionString = parameters.get(1)?.name,
let direction = CascadeDirection(directionString) {
cascadeDirection = direction
}
return .cascade(delta: parameters.getDouble(0) ?? 0.02, direction: cascadeDirection, animationDelayUntilMatchedViews:parameters.getBool(2) ?? false)
case "source":
if let v = parameters.get(0)?.name {
return .motionIdentifier(v)
}
case "useGlobalCoordinateSpace":
return .useGlobalCoordinateSpace
case "useSameParentCoordinateSpace":
return .useSameParentCoordinateSpace
case "ignoreSubviewTransitions":
return .ignoreSubviewTransitions(recursive:parameters.getBool(0) ?? false)
case "zPosition":
if let zPosition = parameters.getCGFloat(0) {
return .zPosition(zPosition)
}
case "useOptimizedSnapshot":
return .useOptimizedSnapshot
case "useNormalSnapshot":
return .useNormalSnapshot
case "useLayerRenderSnapshot":
return .useLayerRenderSnapshot
case "useNoSnapshot":
return .useNoSnapshot
case "forceAnimate":
return .forceAnimate
default: break
}
return nil
}
return nil
}
}
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