Commit 959610e1 by Daniel Dahan

reworked MotionTransition+MotionStringConvertible

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