Commit d6904f6a by Daniel Dahan

added base Motion class and MotionAnimation class

parent 5dc54456
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
961409AA1E43CF1B00E7BA99 /* Motion+Obj-C.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */; }; 961409AA1E43CF1B00E7BA99 /* Motion+Obj-C.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */; };
961409B61E43D17200E7BA99 /* Motion+Obj-C.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 961409B61E43D17200E7BA99 /* Motion+Obj-C.swift in Headers */ = {isa = PBXBuildFile; fileRef = 961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */; settings = {ATTRIBUTES = (Public, ); }; };
961409B81E43D21300E7BA99 /* Motion.h in Headers */ = {isa = PBXBuildFile; fileRef = 96C98DED1E438A5700B22906 /* Motion.h */; settings = {ATTRIBUTES = (Public, ); }; }; 961409B81E43D21300E7BA99 /* Motion.h in Headers */ = {isa = PBXBuildFile; fileRef = 96C98DED1E438A5700B22906 /* Motion.h */; settings = {ATTRIBUTES = (Public, ); }; };
964C153D1EDCF6EA00F0869D /* Motion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964C153C1EDCF6EA00F0869D /* Motion.swift */; };
9657A6AC1EDA1601004461DE /* MotionObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6AB1EDA1601004461DE /* MotionObserver.swift */; }; 9657A6AC1EDA1601004461DE /* MotionObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6AB1EDA1601004461DE /* MotionObserver.swift */; };
9657A6AE1EDA19D8004461DE /* MotionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6AD1EDA19D8004461DE /* MotionAnimator.swift */; }; 9657A6AE1EDA19D8004461DE /* MotionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6AD1EDA19D8004461DE /* MotionAnimator.swift */; };
9657A6B31EDA63FC004461DE /* MotionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6B21EDA63FC004461DE /* MotionContext.swift */; }; 9657A6B31EDA63FC004461DE /* MotionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9657A6B21EDA63FC004461DE /* MotionContext.swift */; };
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Motion+Obj-C.swift"; sourceTree = "<group>"; }; 961409A91E43CF1B00E7BA99 /* Motion+Obj-C.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Motion+Obj-C.swift"; sourceTree = "<group>"; };
964C153C1EDCF6EA00F0869D /* Motion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Motion.swift; sourceTree = "<group>"; };
9657A6AB1EDA1601004461DE /* MotionObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionObserver.swift; sourceTree = "<group>"; }; 9657A6AB1EDA1601004461DE /* MotionObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionObserver.swift; sourceTree = "<group>"; };
9657A6AD1EDA19D8004461DE /* MotionAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionAnimator.swift; sourceTree = "<group>"; }; 9657A6AD1EDA19D8004461DE /* MotionAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionAnimator.swift; sourceTree = "<group>"; };
9657A6B21EDA63FC004461DE /* MotionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionContext.swift; sourceTree = "<group>"; }; 9657A6B21EDA63FC004461DE /* MotionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MotionContext.swift; sourceTree = "<group>"; };
...@@ -65,6 +67,7 @@ ...@@ -65,6 +67,7 @@
96C98DE21E43809D00B22906 /* LICENSE */, 96C98DE21E43809D00B22906 /* LICENSE */,
96C98DDD1E424B9000B22906 /* Info.plist */, 96C98DDD1E424B9000B22906 /* Info.plist */,
96C98DED1E438A5700B22906 /* Motion.h */, 96C98DED1E438A5700B22906 /* Motion.h */,
964C153C1EDCF6EA00F0869D /* Motion.swift */,
96C98DE31E4382B100B22906 /* MotionController.swift */, 96C98DE31E4382B100B22906 /* MotionController.swift */,
9657A6AB1EDA1601004461DE /* MotionObserver.swift */, 9657A6AB1EDA1601004461DE /* MotionObserver.swift */,
9657A6B21EDA63FC004461DE /* MotionContext.swift */, 9657A6B21EDA63FC004461DE /* MotionContext.swift */,
...@@ -163,6 +166,7 @@ ...@@ -163,6 +166,7 @@
9657A6AC1EDA1601004461DE /* MotionObserver.swift in Sources */, 9657A6AC1EDA1601004461DE /* MotionObserver.swift in Sources */,
9657A6B31EDA63FC004461DE /* MotionContext.swift in Sources */, 9657A6B31EDA63FC004461DE /* MotionContext.swift in Sources */,
961409AA1E43CF1B00E7BA99 /* Motion+Obj-C.swift in Sources */, 961409AA1E43CF1B00E7BA99 /* Motion+Obj-C.swift in Sources */,
964C153D1EDCF6EA00F0869D /* Motion.swift in Sources */,
96C98DE41E4382B100B22906 /* MotionController.swift in Sources */, 96C98DE41E4382B100B22906 /* MotionController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
......
...@@ -31,5 +31,64 @@ ...@@ -31,5 +31,64 @@
import UIKit import UIKit
open class MotionContext { open class MotionContext {
/// A reference to the transition container.
fileprivate var transitionContainer: UIView
/// An index source of identifiers to their corresponding view.
fileprivate var transitionSourceIdentifierToView = [String: UIView]()
/// An index of destination identifiers to their corresponding view.
fileprivate var transitionDestinationIdentifierToView = [String: UIView]()
/// An index of views to their corresponding snapshot view.
fileprivate var transitionSnapshotToView = [UIView: UIView]()
/// A reference to the transition from views.
fileprivate var fromViews: [UIView]!
/// A reference to the transition to views.
fileprivate var toViews: [UIView]!
/**
An initializer that accepts a given transition container view.
- Parameter transitionContainer: A UIView.
*/
init(transitionContainer: UIView) {
self.transitionContainer = transitionContainer
}
}
extension MotionContext {
/**
Prepares the source views to their identifiers.
- Parameter views: An Array of UIViews.
- Parameter identifierIndex: An Dictionary of identifiers to UIViews.
*/
fileprivate func prepare(views: [UIView], identifierIndex: inout [String: UIView]) {
for v in views {
v.layer.removeAllAnimations()
guard transitionContainer.convert(v.bounds, from: v).intersects(transitionContainer.bounds) else {
return
}
if let i = v.motionIdentifier {
identifierIndex[i] = v
}
}
}
}
extension MotionContext {
/**
Sets the views that will transition from one state to another.
- Parameter fromViews: An Array of UIViews.
- Parameter toViews: An Array of UIViews.
*/
fileprivate func set(fromViews: [UIView], toViews: [UIView]) {
self.fromViews = fromViews
self.toViews = toViews
prepare(views: fromViews, identifierIndex: &transitionSourceIdentifierToView)
prepare(views: toViews, identifierIndex: &transitionDestinationIdentifierToView)
}
} }
...@@ -116,6 +116,33 @@ open class MotionController: NSObject, MotionSubscriber { ...@@ -116,6 +116,33 @@ open class MotionController: NSObject, MotionSubscriber {
extension MotionController { extension MotionController {
/** /**
Retrieves all the subviews of a given view.
- Parameter of view: A UIView.
- Returns: An Array of UIViews.
*/
fileprivate func subviews(of view: UIView) -> [UIView] {
var views: [UIView] = []
subviews(of: view, views: &views)
return views
}
/**
Populates an Array of UIViews with the subviews of a given view.
- Parameter of view: A UIView.
- Returns: An Array of UIViews.
*/
fileprivate func subviews(of view: UIView, views: inout [UIView]) {
for v in view.subviews {
if nil != v.motionIdentifier {
views.append(v)
}
subviews(of: v, views: &views)
}
}
}
extension MotionController {
/**
Handles the animation update for the display link. Handles the animation update for the display link.
- Parameter displayLink: A CADisplayLink.animation - Parameter displayLink: A CADisplayLink.animation
*/ */
......
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