Commit b04f0258 by Daniel Dahan

updated bug fixes on SideNav when single viewcontainer was used

parent 493444cf
...@@ -42,20 +42,20 @@ public class SideNavContainer : Printable { ...@@ -42,20 +42,20 @@ public class SideNavContainer : Printable {
@objc(SideNavDelegate) @objc(SideNavDelegate)
public protocol SideNavDelegate { public protocol SideNavDelegate {
// left // left
optional func sideNavDidBeginLeftPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidBeginLeftPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidChangeLeftPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidChangeLeftPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidEndLeftPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidEndLeftPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidOpenLeftViewContainer(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidOpenLeftViewContainer(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidCloseLeftViewContainer(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidCloseLeftViewContainer(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidTapLeft(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidTapLeft(nav: SideNavController, container: SideNavContainer)
// right // right
optional func sideNavDidBeginRightPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidBeginRightPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidChangeRightPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidChangeRightPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidEndRightPan(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidEndRightPan(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidOpenRightViewContainer(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidOpenRightViewContainer(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidCloseRightViewContainer(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidCloseRightViewContainer(nav: SideNavController, container: SideNavContainer)
optional func sideNavDidTapRight(sideNav: SideNavController, container: SideNavContainer) optional func sideNavDidTapRight(nav: SideNavController, container: SideNavContainer)
} }
@objc(SideNavController) @objc(SideNavController)
...@@ -97,14 +97,17 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -97,14 +97,17 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
:name: isLeftContainerOpened :name: isLeftContainerOpened
*/ */
public var isLeftContainerOpened: Bool { public var isLeftContainerOpened: Bool {
return 0 == leftViewContainer.frame.origin.x return 0 == leftViewContainer?.frame.origin.x
} }
/** /**
:name: isRightContainerOpened :name: isRightContainerOpened
*/ */
public var isRightContainerOpened: Bool { public var isRightContainerOpened: Bool {
return rightViewContainer.frame.origin.x == rightOriginX - rightViewContainer.frame.size.width if let c = rightViewContainer {
return c.frame.origin.x == rightOriginX - c.frame.size.width
}
return false
} }
/** /**
...@@ -112,42 +115,42 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -112,42 +115,42 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
*/ */
public private(set) var isUserInteractionEnabled: Bool { public private(set) var isUserInteractionEnabled: Bool {
get { get {
return mainViewContainer.userInteractionEnabled return mainViewContainer!.userInteractionEnabled
} }
set(value) { set(value) {
mainViewContainer.userInteractionEnabled = value mainViewContainer?.userInteractionEnabled = value
} }
} }
/** /**
:name: backdropViewContainer :name: backdropViewContainer
*/ */
public private(set) var backdropViewContainer: UIView! public private(set) var backdropViewContainer: UIView?
/** /**
:name: mainViewContainer :name: mainViewContainer
*/ */
public private(set) var mainViewContainer: UIView! public private(set) var mainViewContainer: UIView?
/** /**
:name: leftViewContainer :name: leftViewContainer
*/ */
public private(set) var leftViewContainer: UIView! public private(set) var leftViewContainer: UIView?
/** /**
:name: rightViewContainer :name: rightViewContainer
*/ */
public private(set) var rightViewContainer: UIView! public private(set) var rightViewContainer: UIView?
/** /**
:name: leftContainer :name: leftContainer
*/ */
public private(set) var leftContainer: SideNavContainer! public private(set) var leftContainer: SideNavContainer?
/** /**
:name: rightContainer :name: rightContainer
*/ */
public private(set) var rightContainer: SideNavContainer! public private(set) var rightContainer: SideNavContainer?
/** /**
:name: mainViewController :name: mainViewController
...@@ -220,7 +223,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -220,7 +223,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
self.init() self.init()
self.mainViewController = mainViewController self.mainViewController = mainViewController
self.leftViewController = leftViewController self.leftViewController = leftViewController
setupView() setupView()
setupLeftView()
} }
/** /**
...@@ -230,7 +234,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -230,7 +234,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
self.init() self.init()
self.mainViewController = mainViewController self.mainViewController = mainViewController
self.rightViewController = rightViewController self.rightViewController = rightViewController
setupView() setupView()
setupRightView()
} }
/** /**
...@@ -242,6 +247,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -242,6 +247,8 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
self.leftViewController = leftViewController self.leftViewController = leftViewController
self.rightViewController = rightViewController self.rightViewController = rightViewController
setupView() setupView()
setupLeftView()
setupRightView()
} }
// //
...@@ -257,9 +264,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -257,9 +264,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
public override func viewWillLayoutSubviews() { public override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews() super.viewWillLayoutSubviews()
prepareContainedViewController(mainViewContainer, viewController: mainViewController) prepareContainedViewController(&mainViewContainer, viewController: &mainViewController)
prepareContainedViewController(leftViewContainer, viewController: leftViewController) prepareContainedViewController(&leftViewContainer, viewController: &leftViewController)
prepareContainedViewController(rightViewContainer, viewController: rightViewController) prepareContainedViewController(&rightViewContainer, viewController: &rightViewController)
} }
// //
...@@ -267,24 +274,28 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -267,24 +274,28 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
public override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { public override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
mainViewContainer.transform = CGAffineTransformMakeScale(1, 1) mainViewContainer?.transform = CGAffineTransformMakeScale(1, 1)
leftViewContainer.hidden = true leftViewContainer?.hidden = true
rightViewContainer.hidden = true rightViewContainer?.hidden = true
coordinator.animateAlongsideTransition(nil) { _ in coordinator.animateAlongsideTransition(nil) { _ in
self.toggleWindow() self.toggleWindow()
self.backdropViewContainer.layer.opacity = 0 self.backdropViewContainer?.layer.opacity = 0
self.mainViewContainer.transform = CGAffineTransformMakeScale(1, 1) self.mainViewContainer?.transform = CGAffineTransformMakeScale(1, 1)
self.isUserInteractionEnabled = true self.isUserInteractionEnabled = true
self.leftViewContainer.frame.origin.x = self.leftOriginX if let vc = self.leftViewContainer {
self.leftViewContainer.hidden = false vc.frame.origin.x = self.leftOriginX
self.removeShadow(self.leftViewContainer) vc.hidden = false
self.prepareLeftGestures() self.removeShadow(&self.leftViewContainer)
self.prepareLeftGestures()
}
self.rightViewContainer.frame.origin.x = self.rightOriginX if let vc = self.rightViewContainer {
self.rightViewContainer.hidden = false vc.frame.origin.x = self.rightOriginX
self.removeShadow(self.rightViewContainer) vc.hidden = false
self.prepareRightGestures() self.removeShadow(&self.rightViewContainer)
self.prepareRightGestures()
}
} }
} }
...@@ -306,95 +317,111 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -306,95 +317,111 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
:name: openLeftViewContainer :name: openLeftViewContainer
*/ */
public func openLeftViewContainer(velocity: CGFloat = 0) { public func openLeftViewContainer(velocity: CGFloat = 0) {
prepareContainerToOpen(&leftViewController, viewContainer: &leftViewContainer, state: leftContainer.state) if let vc = leftViewContainer {
UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, Double(leftViewContainer.frame.origin.x / velocity)))), if let c = leftContainer {
delay: 0, prepareContainerToOpen(&leftViewController, viewContainer: &leftViewContainer, state: c.state)
options: .CurveEaseInOut, UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, Double(vc.frame.origin.x / velocity)))),
animations: { _ in delay: 0,
self.leftViewContainer.frame.origin.x = 0 options: .CurveEaseInOut,
self.backdropViewContainer.layer.opacity = Float(options.contentViewOpacity) animations: { _ in
self.mainViewContainer.transform = CGAffineTransformMakeScale(options.contentViewScale, options.contentViewScale) vc.frame.origin.x = 0
self.backdropViewContainer?.layer.opacity = Float(options.contentViewOpacity)
self.mainViewContainer?.transform = CGAffineTransformMakeScale(options.contentViewScale, options.contentViewScale)
}
) { _ in
self.isUserInteractionEnabled = false
self.leftViewController?.endAppearanceTransition()
}
c.state = .Opened
delegate?.sideNavDidOpenLeftViewContainer?(self, container: c)
} }
) { _ in
self.isUserInteractionEnabled = false
self.leftViewController?.endAppearanceTransition()
} }
leftContainer.state = .Opened
delegate?.sideNavDidOpenLeftViewContainer?(self, container: leftContainer)
} }
/** /**
:name: openRightViewContainer :name: openRightViewContainer
*/ */
public func openRightViewContainer(velocity: CGFloat = 0) { public func openRightViewContainer(velocity: CGFloat = 0) {
prepareContainerToOpen(&rightViewController, viewContainer: &rightViewContainer, state: rightContainer.state) if let vc = rightViewContainer {
UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, Double(fabs(rightViewContainer.frame.origin.x - rightOriginX) / velocity)))), if let c = rightContainer {
delay: 0, prepareContainerToOpen(&rightViewController, viewContainer: &rightViewContainer, state: c.state)
options: .CurveEaseInOut, UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, Double(fabs(vc.frame.origin.x - rightOriginX) / velocity)))),
animations: { _ in delay: 0,
self.rightViewContainer.frame.origin.x = self.rightOriginX - self.rightViewContainer.frame.size.width options: .CurveEaseInOut,
self.backdropViewContainer.layer.opacity = Float(options.contentViewOpacity) animations: { _ in
self.mainViewContainer.transform = CGAffineTransformMakeScale(options.contentViewScale, options.contentViewScale) vc.frame.origin.x = self.rightOriginX - vc.frame.size.width
self.backdropViewContainer?.layer.opacity = Float(options.contentViewOpacity)
self.mainViewContainer?.transform = CGAffineTransformMakeScale(options.contentViewScale, options.contentViewScale)
}
) { _ in
self.isUserInteractionEnabled = false
self.rightViewController?.endAppearanceTransition()
}
c.state = .Opened
delegate?.sideNavDidOpenRightViewContainer?(self, container: c)
} }
) { _ in
self.isUserInteractionEnabled = false
self.rightViewController?.endAppearanceTransition()
} }
rightContainer.state = .Opened
delegate?.sideNavDidOpenRightViewContainer?(self, container: rightContainer)
} }
/** /**
:name: closeLeftViewContainer :name: closeLeftViewContainer
*/ */
public func closeLeftViewContainer(velocity: CGFloat = 0) { public func closeLeftViewContainer(velocity: CGFloat = 0) {
prepareContainerToClose(&leftViewController, state: leftContainer.state) if let vc = leftViewContainer {
UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, fabs(leftViewContainer.frame.origin.x - leftOriginX) / velocity))), if let c = leftContainer {
delay: 0, prepareContainerToClose(&leftViewController, state: c.state)
options: .CurveEaseInOut, UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, fabs(vc.frame.origin.x - leftOriginX) / velocity))),
animations: { _ in delay: 0,
self.leftViewContainer.frame.origin.x = self.leftOriginX options: .CurveEaseInOut,
self.backdropViewContainer.layer.opacity = 0 animations: { _ in
self.mainViewContainer.transform = CGAffineTransformMakeScale(1, 1) vc.frame.origin.x = self.leftOriginX
self.backdropViewContainer?.layer.opacity = 0
self.mainViewContainer?.transform = CGAffineTransformMakeScale(1, 1)
}
) { _ in
self.removeShadow(&self.leftViewContainer)
self.isUserInteractionEnabled = true
self.leftViewController?.endAppearanceTransition()
}
c.state = .Closed
delegate?.sideNavDidCloseLeftViewContainer?(self, container: c)
} }
) { _ in
self.removeShadow(self.leftViewContainer)
self.isUserInteractionEnabled = true
self.leftViewController?.endAppearanceTransition()
} }
leftContainer.state = .Closed
delegate?.sideNavDidCloseLeftViewContainer?(self, container: leftContainer)
} }
/** /**
:name: closeRightViewContainer :name: closeRightViewContainer
*/ */
public func closeRightViewContainer(velocity: CGFloat = 0) { public func closeRightViewContainer(velocity: CGFloat = 0) {
prepareContainerToClose(&rightViewController, state: rightContainer.state) if let vc = rightViewContainer {
UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, fabs(rightViewContainer.frame.origin.x - rightOriginX) / velocity))), if let c = rightContainer {
delay: 0, prepareContainerToClose(&rightViewController, state: c.state)
options: .CurveEaseInOut, UIView.animateWithDuration(Double(0 == velocity ? options.animationDuration : fmax(0.1, fmin(1, fabs(vc.frame.origin.x - rightOriginX) / velocity))),
animations: { _ in delay: 0,
self.rightViewContainer.frame.origin.x = self.rightOriginX options: .CurveEaseInOut,
self.backdropViewContainer.layer.opacity = 0 animations: { _ in
self.mainViewContainer.transform = CGAffineTransformMakeScale(1, 1) vc.frame.origin.x = self.rightOriginX
self.backdropViewContainer?.layer.opacity = 0
self.mainViewContainer?.transform = CGAffineTransformMakeScale(1, 1)
}
) { _ in
self.removeShadow(&self.rightViewContainer)
self.isUserInteractionEnabled = true
self.rightViewController?.endAppearanceTransition()
}
c.state = .Closed
delegate?.sideNavDidCloseRightViewContainer?(self, container: c)
} }
) { _ in
self.removeShadow(self.rightViewContainer)
self.isUserInteractionEnabled = true
self.rightViewController?.endAppearanceTransition()
} }
rightContainer.state = .Closed
delegate?.sideNavDidCloseRightViewContainer?(self, container: rightContainer)
} }
/** /**
:name: switchMainViewController :name: switchMainViewController
*/ */
public func switchMainViewController(viewController: UIViewController, closeViewContainers: Bool) { public func switchMainViewController(viewController: UIViewController, closeViewContainers: Bool) {
removeViewController(mainViewController) removeViewController(&mainViewController)
mainViewController = viewController mainViewController = viewController
prepareContainedViewController(mainViewContainer, viewController: mainViewController) prepareContainedViewController(&mainViewContainer, viewController: &mainViewController)
if closeViewContainers { if closeViewContainers {
closeLeftViewContainer() closeLeftViewContainer()
closeRightViewContainer() closeRightViewContainer()
...@@ -405,9 +432,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -405,9 +432,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
:name: switchLeftViewController :name: switchLeftViewController
*/ */
public func switchLeftViewController(viewController: UIViewController, closeLeftViewContainerViewContainer: Bool) { public func switchLeftViewController(viewController: UIViewController, closeLeftViewContainerViewContainer: Bool) {
removeViewController(leftViewController) removeViewController(&leftViewController)
leftViewController = viewController leftViewController = viewController
prepareContainedViewController(leftViewContainer, viewController: leftViewController) prepareContainedViewController(&leftViewContainer, viewController: &leftViewController)
if closeLeftViewContainerViewContainer { if closeLeftViewContainerViewContainer {
closeLeftViewContainer() closeLeftViewContainer()
} }
...@@ -417,9 +444,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -417,9 +444,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
:name: switchRightViewController :name: switchRightViewController
*/ */
public func switchRightViewController(viewController: UIViewController, closeRightViewContainerViewContainer: Bool) { public func switchRightViewController(viewController: UIViewController, closeRightViewContainerViewContainer: Bool) {
removeViewController(rightViewController) removeViewController(&rightViewController)
rightViewController = viewController rightViewController = viewController
prepareContainedViewController(rightViewContainer, viewController: rightViewController) prepareContainedViewController(&rightViewContainer, viewController: &rightViewController)
if closeRightViewContainerViewContainer { if closeRightViewContainerViewContainer {
closeRightViewContainer() closeRightViewContainer()
} }
...@@ -450,10 +477,20 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -450,10 +477,20 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
internal func setupView() { internal func setupView() {
prepareMainContainer() prepareMainContainer()
prepareBackdropContainer() prepareBackdropContainer()
}
//
// :name: setupLeftView
//
internal func setupLeftView() {
prepareContainer(&leftContainer, viewContainer: &leftViewContainer, originX: leftOriginX, width: options.leftViewContainerWidth) prepareContainer(&leftContainer, viewContainer: &leftViewContainer, originX: leftOriginX, width: options.leftViewContainerWidth)
prepareLeftGestures() prepareLeftGestures()
}
//
// :name: setupRightView
//
internal func setupRightView() {
prepareContainer(&rightContainer, viewContainer: &rightViewContainer, originX: rightOriginX, width: options.rightViewContainerWidth) prepareContainer(&rightContainer, viewContainer: &rightViewContainer, originX: rightOriginX, width: options.rightViewContainerWidth)
prepareRightGestures() prepareRightGestures()
} }
...@@ -494,35 +531,43 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -494,35 +531,43 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
internal func handleLeftPanGesture(gesture: UIPanGestureRecognizer) { internal func handleLeftPanGesture(gesture: UIPanGestureRecognizer) {
if isRightContainerOpened { return } if isRightContainerOpened { return }
if .Began == gesture.state { if .Began == gesture.state {
leftContainer.state = isLeftContainerOpened ? .Opened : .Closed if let vc = leftViewContainer {
leftContainer.point = gesture.locationInView(view) if let c = leftContainer {
leftContainer.frame = leftViewContainer.frame leftViewController?.beginAppearanceTransition(!isLeftContainerOpened, animated: true)
delegate?.sideNavDidBeginLeftPan?(self, container: leftContainer) addShadow(&leftViewContainer)
leftViewController?.beginAppearanceTransition(!isLeftContainerOpened, animated: true) toggleWindow(shouldOpen: true)
addShadow(leftViewContainer) c.state = isLeftContainerOpened ? .Opened : .Closed
toggleWindow(shouldOpen: true) c.point = gesture.locationInView(view)
c.frame = vc.frame
delegate?.sideNavDidBeginLeftPan?(self, container: c)
}
}
} else if .Changed == gesture.state { } else if .Changed == gesture.state {
let v: CGPoint = gesture.translationInView(gesture.view!) if let vc = leftViewContainer {
let r = (leftViewContainer.frame.origin.x - leftOriginX) / leftViewContainer.frame.size.width if let c = leftContainer {
let s: CGFloat = 1 - (1 - options.contentViewScale) * r c.point = gesture.translationInView(gesture.view!)
let x: CGFloat = leftContainer.frame.origin.x + v.x let r = (vc.frame.origin.x - leftOriginX) / vc.frame.size.width
leftViewContainer.frame.origin.x = x < leftOriginX ? leftOriginX : x > 0 ? 0 : x let s: CGFloat = 1 - (1 - options.contentViewScale) * r
backdropViewContainer.layer.opacity = Float(r * options.contentViewOpacity) let x: CGFloat = c.frame.origin.x + c.point.x
mainViewContainer.transform = CGAffineTransformMakeScale(s, s) vc.frame.origin.x = x < leftOriginX ? leftOriginX : x > 0 ? 0 : x
if nil != delegate?.sideNavDidChangeLeftPan { backdropViewContainer?.layer.opacity = Float(r * options.contentViewOpacity)
delegate?.sideNavDidChangeLeftPan?(self, container: SideNavContainer(state: leftContainer.state, point: v, frame: leftContainer.frame)) mainViewContainer?.transform = CGAffineTransformMakeScale(s, s)
delegate?.sideNavDidChangeLeftPan?(self, container: c)
}
} }
} else { } else {
let v: CGPoint = gesture.velocityInView(gesture.view) if let vc = leftViewContainer {
let x: CGFloat = v.x >= 1000 || v.x <= -1000 ? v.x : 0 if let c = leftContainer {
let s: SideNavState = leftViewContainer.frame.origin.x <= CGFloat(floor(leftOriginX)) + options.pointOfNoReturnWidth || v.x <= -1000 ? .Closed : .Opened c.point = gesture.velocityInView(gesture.view)
if .Closed == s { let x: CGFloat = c.point.x >= 1000 || c.point.x <= -1000 ? c.point.x : 0
closeLeftViewContainer(velocity: x) c.state = vc.frame.origin.x <= CGFloat(floor(leftOriginX)) + options.pointOfNoReturnWidth || c.point.x <= -1000 ? .Closed : .Opened
} else { if .Closed == c.state {
openLeftViewContainer(velocity: x) closeLeftViewContainer(velocity: x)
} } else {
if nil != delegate?.sideNavDidEndLeftPan { openLeftViewContainer(velocity: x)
delegate?.sideNavDidEndLeftPan?(self, container: SideNavContainer(state: s, point: v, frame: leftContainer.frame)) }
delegate?.sideNavDidEndLeftPan?(self, container: c)
}
} }
} }
} }
...@@ -531,8 +576,10 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -531,8 +576,10 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// :name: handleLeftTapGesture // :name: handleLeftTapGesture
// //
internal func handleLeftTapGesture(gesture: UIPanGestureRecognizer) { internal func handleLeftTapGesture(gesture: UIPanGestureRecognizer) {
delegate?.sideNavDidTapLeft?(self, container: leftContainer) if let c = leftContainer {
closeLeftViewContainer() delegate?.sideNavDidTapLeft?(self, container: c)
closeLeftViewContainer()
}
} }
// //
...@@ -541,37 +588,44 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -541,37 +588,44 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
internal func handleRightPanGesture(gesture: UIPanGestureRecognizer) { internal func handleRightPanGesture(gesture: UIPanGestureRecognizer) {
if isLeftContainerOpened { return } if isLeftContainerOpened { return }
if .Began == gesture.state { if .Began == gesture.state {
rightContainer.state = isRightContainerOpened ? .Opened : .Closed if let vc = rightViewContainer {
rightContainer.point = gesture.locationInView(view) if let c = rightContainer {
rightContainer.frame = rightViewContainer.frame rightViewController?.beginAppearanceTransition(!isRightContainerOpened, animated: true)
delegate?.sideNavDidBeginRightPan?(self, container: rightContainer) addShadow(&rightViewContainer)
rightViewController?.beginAppearanceTransition(!isRightContainerOpened, animated: true) toggleWindow(shouldOpen: true)
addShadow(rightViewContainer) c.state = isRightContainerOpened ? .Opened : .Closed
toggleWindow(shouldOpen: true) c.point = gesture.locationInView(view)
c.frame = vc.frame
delegate?.sideNavDidBeginRightPan?(self, container: c)
}
}
} else if .Changed == gesture.state { } else if .Changed == gesture.state {
let v: CGPoint = gesture.translationInView(gesture.view!) if let vc = rightViewContainer {
if let c = rightContainer {
let r = (rightOriginX - rightViewContainer.frame.origin.x) / rightViewContainer.frame.size.width c.point = gesture.translationInView(gesture.view!)
let s: CGFloat = 1 - (1 - options.contentViewScale) * r let r = (rightOriginX - vc.frame.origin.x) / vc.frame.size.width
let m: CGFloat = rightOriginX - rightViewContainer.frame.size.width let s: CGFloat = 1 - (1 - options.contentViewScale) * r
let x: CGFloat = rightContainer.frame.origin.x + gesture.translationInView(gesture.view!).x let m: CGFloat = rightOriginX - vc.frame.size.width
rightViewContainer.frame.origin.x = x > rightOriginX ? rightOriginX : x < m ? m : x let x: CGFloat = c.frame.origin.x + c.point.x
backdropViewContainer.layer.opacity = Float(r * options.contentViewOpacity) vc.frame.origin.x = x > rightOriginX ? rightOriginX : x < m ? m : x
mainViewContainer.transform = CGAffineTransformMakeScale(s, s) backdropViewContainer?.layer.opacity = Float(r * options.contentViewOpacity)
if nil != delegate?.sideNavDidChangeRightPan { mainViewContainer?.transform = CGAffineTransformMakeScale(s, s)
delegate?.sideNavDidChangeRightPan?(self, container: SideNavContainer(state: rightContainer.state, point: v, frame: rightContainer.frame)) delegate?.sideNavDidChangeRightPan?(self, container: c)
}
} }
} else { } else {
let v: CGPoint = gesture.velocityInView(gesture.view) if let vc = rightViewContainer {
let x: CGFloat = v.x <= -1000 || v.x >= 1000 ? v.x : 0 if let c = rightContainer {
let s: SideNavState = rightViewContainer.frame.origin.x >= CGFloat(floor(rightOriginX) - options.pointOfNoReturnWidth) || v.x >= 1000 ? .Closed : .Opened c.point = gesture.velocityInView(gesture.view)
if .Closed == s { let x: CGFloat = c.point.x <= -1000 || c.point.x >= 1000 ? c.point.x : 0
closeRightViewContainer(velocity: x) c.state = vc.frame.origin.x >= CGFloat(floor(rightOriginX) - options.pointOfNoReturnWidth) || c.point.x >= 1000 ? .Closed : .Opened
} else { if .Closed == c.state {
openRightViewContainer(velocity: x) closeRightViewContainer(velocity: x)
} } else {
if nil != delegate?.sideNavDidEndRightPan { openRightViewContainer(velocity: x)
delegate?.sideNavDidEndRightPan?(self, container: SideNavContainer(state: s, point: v, frame: rightContainer.frame)) }
delegate?.sideNavDidEndRightPan?(self, container: c)
}
} }
} }
} }
...@@ -580,27 +634,33 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -580,27 +634,33 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// :name: handleRightTapGesture // :name: handleRightTapGesture
// //
internal func handleRightTapGesture(gesture: UIPanGestureRecognizer) { internal func handleRightTapGesture(gesture: UIPanGestureRecognizer) {
delegate?.sideNavDidTapRight?(self, container: rightContainer) if let c = rightContainer {
closeRightViewContainer() delegate?.sideNavDidTapRight?(self, container: c)
closeRightViewContainer()
}
} }
// //
// :name: addShadow // :name: addShadow
// //
private func addShadow(container: UIView) { private func addShadow(inout viewContainer: UIView?) {
container.layer.shadowOffset = options.shadowOffset if let vc = viewContainer {
container.layer.shadowOpacity = options.shadowOpacity vc.layer.shadowOffset = options.shadowOffset
container.layer.shadowRadius = options.shadowRadius vc.layer.shadowOpacity = options.shadowOpacity
container.layer.shadowPath = UIBezierPath(rect: container.bounds).CGPath vc.layer.shadowRadius = options.shadowRadius
container.layer.masksToBounds = false vc.layer.shadowPath = UIBezierPath(rect: vc.bounds).CGPath
vc.layer.masksToBounds = false
}
} }
// //
// :name: removeShadow // :name: removeShadow
// //
private func removeShadow(container: UIView) { private func removeShadow(inout viewContainer: UIView?) {
container.layer.opacity = 1 if let vc = viewContainer {
container.layer.masksToBounds = true vc.layer.opacity = 1
vc.layer.masksToBounds = true
}
} }
// //
...@@ -623,7 +683,7 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -623,7 +683,7 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
// :name: removeViewController // :name: removeViewController
// //
private func removeViewController(viewController: UIViewController?) { private func removeViewController(inout viewController: UIViewController?) {
if let vc = viewController { if let vc = viewController {
vc.willMoveToParentViewController(nil) vc.willMoveToParentViewController(nil)
vc.view.removeFromSuperview() vc.view.removeFromSuperview()
...@@ -670,8 +730,11 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -670,8 +730,11 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
// :name: isPointContainedWithinViewController // :name: isPointContainedWithinViewController
// //
private func isPointContainedWithinViewController(inout viewContainer: UIView!, point: CGPoint) -> Bool { private func isPointContainedWithinViewController(inout viewContainer: UIView?, point: CGPoint) -> Bool {
return CGRectContainsPoint(viewContainer.frame, point) if let vc = viewContainer {
return CGRectContainsPoint(vc.frame, point)
}
return false
} }
// //
...@@ -679,9 +742,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -679,9 +742,9 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
private func prepareMainContainer() { private func prepareMainContainer() {
mainViewContainer = UIView(frame: view.bounds) mainViewContainer = UIView(frame: view.bounds)
mainViewContainer.backgroundColor = .clearColor() mainViewContainer!.backgroundColor = .clearColor()
mainViewContainer.autoresizingMask = .FlexibleHeight | .FlexibleWidth mainViewContainer!.autoresizingMask = .FlexibleHeight | .FlexibleWidth
view.addSubview(mainViewContainer) view.addSubview(mainViewContainer!)
} }
// //
...@@ -689,10 +752,10 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -689,10 +752,10 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
private func prepareBackdropContainer() { private func prepareBackdropContainer() {
backdropViewContainer = UIView(frame: view.bounds) backdropViewContainer = UIView(frame: view.bounds)
backdropViewContainer.backgroundColor = options.backdropViewContainerBackgroundColor backdropViewContainer!.backgroundColor = options.backdropViewContainerBackgroundColor
backdropViewContainer.autoresizingMask = .FlexibleHeight | .FlexibleWidth backdropViewContainer!.autoresizingMask = .FlexibleHeight | .FlexibleWidth
backdropViewContainer.layer.opacity = 0 backdropViewContainer!.layer.opacity = 0
view.addSubview(backdropViewContainer) view.addSubview(backdropViewContainer!)
} }
// //
...@@ -706,15 +769,15 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -706,15 +769,15 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
// :name: prepareContainer // :name: prepareContainer
// //
private func prepareContainer(inout container: SideNavContainer!, inout viewContainer: UIView!, originX: CGFloat, width: CGFloat) { private func prepareContainer(inout container: SideNavContainer?, inout viewContainer: UIView?, originX: CGFloat, width: CGFloat) {
container = SideNavContainer(state: .Closed, point: CGPointZero, frame: CGRectZero) container = SideNavContainer(state: .Closed, point: CGPointZero, frame: CGRectZero)
var b: CGRect = view.bounds var b: CGRect = view.bounds
b.size.width = width b.size.width = width
b.origin.x = originX b.origin.x = originX
viewContainer = UIView(frame: b) viewContainer = UIView(frame: b)
viewContainer.backgroundColor = .clearColor() viewContainer!.backgroundColor = .clearColor()
viewContainer.autoresizingMask = .FlexibleHeight viewContainer!.autoresizingMask = .FlexibleHeight
view.addSubview(viewContainer) view.addSubview(viewContainer!)
} }
// //
...@@ -728,33 +791,31 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg ...@@ -728,33 +791,31 @@ public class SideNavController: MaterialViewController, UIGestureRecognizerDeleg
// //
// :name: prepareContainerToOpen // :name: prepareContainerToOpen
// //
private func prepareContainerToOpen(inout viewController: UIViewController?, inout viewContainer: UIView!, state: SideNavState) { private func prepareContainerToOpen(inout viewController: UIViewController?, inout viewContainer: UIView?, state: SideNavState) {
if let vc = viewController { viewController?.beginAppearanceTransition(.Opened == state, animated: true)
vc.beginAppearanceTransition(.Opened == state, animated: true) addShadow(&viewContainer)
addShadow(viewContainer) toggleWindow(shouldOpen: true)
toggleWindow(shouldOpen: true)
}
} }
// //
// :name: prepareContainerToClose // :name: prepareContainerToClose
// //
private func prepareContainerToClose(inout viewController: UIViewController?, state: SideNavState) { private func prepareContainerToClose(inout viewController: UIViewController?, state: SideNavState) {
if let vc = viewController { viewController?.beginAppearanceTransition(.Opened == state, animated: true)
vc.beginAppearanceTransition(.Opened == state, animated: true) toggleWindow()
toggleWindow()
}
} }
// //
// :name: prepareContainedViewController // :name: prepareContainedViewController
// //
private func prepareContainedViewController(container: UIView, viewController: UIViewController?) { private func prepareContainedViewController(inout viewContainer: UIView?, inout viewController: UIViewController?) {
if let vc = viewController { if let vc = viewController {
addChildViewController(vc) if let c = viewContainer {
vc.view.frame = container.bounds addChildViewController(vc)
container.addSubview(vc.view) vc.view.frame = c.bounds
vc.didMoveToParentViewController(self) c.addSubview(vc.view)
vc.didMoveToParentViewController(self)
}
} }
} }
} }
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