Commit f7cd058c by Daniel Dahan

SideNavigationViewController working

parent 4c60c25c
...@@ -41,16 +41,6 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -41,16 +41,6 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// //
private var originalPosition: CGPoint! private var originalPosition: CGPoint!
//
// :name: enabled
//
public lazy var enabled: Bool = true
/**
:name: hideStatusBar
*/
public lazy var hideStatusBar: Bool = true
/** /**
:name: horizontalThreshold :name: horizontalThreshold
*/ */
...@@ -61,6 +51,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -61,6 +51,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
*/ */
public static let animationDuration: CGFloat = 0.25 public static let animationDuration: CGFloat = 0.25
//
// :name: enabled
//
public lazy var enabled: Bool = true
/**
:name: hideStatusBar
*/
public lazy var hideStatusBar: Bool = true
/** /**
:name: backdropLayer :name: backdropLayer
*/ */
...@@ -95,8 +95,8 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -95,8 +95,8 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
:name: isLeftContainerOpened :name: isLeftContainerOpened
*/ */
public var isLeftContainerOpened: Bool { public var isLeftContainerOpened: Bool {
if let c = leftView { if let v = leftView {
return c.frame.origin.x != leftOriginX return v.x != leftOriginX
} }
return false return false
} }
...@@ -106,10 +106,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -106,10 +106,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
*/ */
public private(set) var isUserInteractionEnabled: Bool { public private(set) var isUserInteractionEnabled: Bool {
get { get {
return view.userInteractionEnabled return mainViewController!.view.userInteractionEnabled
} }
set(value) { set(value) {
view.userInteractionEnabled = value mainViewController!.view.userInteractionEnabled = value
} }
} }
...@@ -119,14 +119,14 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -119,14 +119,14 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
public private(set) var leftView: MaterialView? public private(set) var leftView: MaterialView?
/** /**
:name: leftViewController :name: maintViewController
*/ */
public var leftViewController: UIViewController? public var mainViewController: UIViewController?
/** /**
:name: leftAnimation :name: leftViewController
*/ */
private var leftAnimation: CAAnimation? public var leftViewController: UIViewController?
/** /**
:name: leftPanGesture :name: leftPanGesture
...@@ -162,17 +162,12 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -162,17 +162,12 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/** /**
:name: init :name: init
*/ */
public init() { public convenience init(mainViewController: UIViewController, leftViewController: UIViewController) {
super.init(nibName: nil, bundle: nil)
prepareView()
}
/**
:name: init
*/
public convenience init(leftViewController: UIViewController) {
self.init() self.init()
self.mainViewController = mainViewController
self.leftViewController = leftViewController self.leftViewController = leftViewController
prepareView()
prepareMainView()
prepareLeftView() prepareLeftView()
} }
...@@ -233,13 +228,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -233,13 +228,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// :name: gestureRecognizer // :name: gestureRecognizer
// //
public func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { public func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if !enabled {
return false
}
if gestureRecognizer == leftPanGesture { if gestureRecognizer == leftPanGesture {
return gesturePanLeftViewController(gestureRecognizer, withTouchPoint: touch.locationInView(view)) return gesturePanLeftViewController(gestureRecognizer, withTouchPoint: touch.locationInView(view))
} }
if gestureRecognizer == leftTapGesture { if gestureRecognizer == leftTapGesture {
return isLeftContainerOpened && !isPointContainedWithinViewController(&leftView, point: touch.locationInView(view)) return isLeftContainerOpened && !isPointContainedWithinViewController(leftView!, point: touch.locationInView(view))
} }
return true return false
} }
// //
...@@ -251,30 +249,27 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -251,30 +249,27 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
} }
// //
// :name: prepareMainView
//
internal func prepareMainView() {
prepareViewControllerWithinContainer(mainViewController!, container: view)
}
//
// :name: prepareLeftView // :name: prepareLeftView
// //
internal func prepareLeftView() { internal func prepareLeftView() {
let w: CGFloat = view.frame.width
let h: CGFloat = view.frame.height
// container // container
leftView = MaterialView() leftView = MaterialView(frame: CGRectMake(0, 0, 240, view.frame.height))
leftView!.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(leftView!) view.addSubview(leftView!)
MaterialLayout.alignToParentVertically(view, child: leftView!)
MaterialLayout.width(view, child: leftView!, width: 240)
MaterialAnimation.animationDisabled({ MaterialAnimation.animationDisabled({
self.leftView!.position = CGPointMake(-w / 2, h / 2) self.leftView!.position = CGPointMake(-self.leftView!.width / 2, self.leftView!.height / 2)
self.leftView!.zPosition = 1000 self.leftView!.zPosition = 1000
self.leftView!.masksToBounds = true self.leftView!.masksToBounds = true
}) })
// viewController prepareViewControllerWithinContainer(leftViewController!, container: leftView!)
addChildViewController(leftViewController!)
leftView!.addSubview(leftViewController!.view)
leftViewController!.didMoveToParentViewController(self)
MaterialLayout.alignToParent(leftView!, child: leftViewController!.view)
// gestures // gestures
prepareLeftGestures() prepareLeftGestures()
...@@ -314,25 +309,25 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -314,25 +309,25 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// :name: handleLeftPanGesture // :name: handleLeftPanGesture
// //
internal func handleLeftPanGesture(recognizer: UIPanGestureRecognizer) { internal func handleLeftPanGesture(recognizer: UIPanGestureRecognizer) {
if let vc = leftView { if let v = leftView {
switch recognizer.state { switch recognizer.state {
case .Began: case .Began:
originalPosition = vc.position originalPosition = v.position
toggleStatusBar(true) toggleStatusBar(true)
SideNavigationViewController.backdropLayer.hidden = false SideNavigationViewController.backdropLayer.hidden = false
case .Changed: case .Changed:
let translation: CGPoint = recognizer.translationInView(vc) let translation: CGPoint = recognizer.translationInView(v)
let w: CGFloat = vc.width let w: CGFloat = v.width
MaterialAnimation.animationDisabled({ MaterialAnimation.animationDisabled({
vc.position.x = self.originalPosition.x + translation.x > (w / 2) ? (w / 2) : self.originalPosition.x + translation.x v.position.x = self.originalPosition.x + translation.x > (w / 2) ? (w / 2) : self.originalPosition.x + translation.x
}) })
case .Ended: case .Ended:
// snap back let point: CGPoint = recognizer.velocityInView(recognizer.view)
let translation: CGPoint = recognizer.translationInView(vc) let x: CGFloat = point.x >= 1000 || point.x <= -1000 ? point.x : 0
if SideNavigationViewController.horizontalThreshold <= translation.x { if v.x <= CGFloat(floor(leftOriginX)) + SideNavigationViewController.horizontalThreshold || point.x <= -1000 {
openLeftViewContainer(recognizer.velocityInView(view).x) closeLeftViewContainer(x)
} else { } else {
closeLeftViewContainer(recognizer.velocityInView(view).x) openLeftViewContainer(x)
} }
default:break default:break
} }
...@@ -342,9 +337,11 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -342,9 +337,11 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// //
// :name: handleLeftTapGesture // :name: handleLeftTapGesture
// //
internal func handleLeftTapGesture(gesture: UIPanGestureRecognizer) { internal func handleLeftTapGesture(recognizer: UIPanGestureRecognizer) {
if let _ = leftView {
closeLeftViewContainer() closeLeftViewContainer()
} }
}
// //
// :name: toggleStatusBar // :name: toggleStatusBar
...@@ -366,12 +363,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -366,12 +363,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// //
// :name: removeViewController // :name: removeViewController
// //
private func removeViewController(inout viewController: UIViewController?) { private func removeViewController(controller: UIViewController) {
if let vc = viewController { controller.willMoveToParentViewController(nil)
vc.willMoveToParentViewController(nil) controller.view.removeFromSuperview()
vc.view.removeFromSuperview() controller.removeFromParentViewController()
vc.removeFromParentViewController()
}
} }
// //
...@@ -385,17 +380,14 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -385,17 +380,14 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
// :name: isLeftPointContainedWithinRect // :name: isLeftPointContainedWithinRect
// //
private func isLeftPointContainedWithinRect(point: CGPoint) -> Bool { private func isLeftPointContainedWithinRect(point: CGPoint) -> Bool {
return CGRectContainsPoint(CGRectMake(0, 0, 64, view.frame.height), point) return CGRectContainsPoint(CGRectMake(0, 0, SideNavigationViewController.horizontalThreshold, view.frame.height), point)
} }
// //
// :name: isPointContainedWithinViewController // :name: isPointContainedWithinViewController
// //
private func isPointContainedWithinViewController(inout viewContainer: MaterialView?, point: CGPoint) -> Bool { private func isPointContainedWithinViewController(container: UIView, point: CGPoint) -> Bool {
if let vc = viewContainer { return CGRectContainsPoint(container.frame, point)
return CGRectContainsPoint(vc.frame, point)
}
return false
} }
// //
...@@ -411,6 +403,17 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -411,6 +403,17 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
} }
// //
// :name: prepareViewControllerWithinContainer
//
private func prepareViewControllerWithinContainer(controller: UIViewController, container: UIView) {
controller.view.translatesAutoresizingMaskIntoConstraints = false
addChildViewController(controller)
container.addSubview(controller.view)
controller.didMoveToParentViewController(self)
MaterialLayout.alignToParent(container, child: controller.view)
}
//
// :name: prepareLeftGestures // :name: prepareLeftGestures
// //
private func prepareLeftGestures() { private func prepareLeftGestures() {
......
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