Commit 80768582 by Daniel Dahan

initial pass to update SideNav with the addition of a right side view

parent 9d14b588
......@@ -11,7 +11,10 @@
9642FA1D1C1B50E700022BC6 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9642FA1C1C1B50E700022BC6 /* MainViewController.swift */; };
9642FA221C1B50E700022BC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9642FA211C1B50E700022BC6 /* Assets.xcassets */; };
9642FA251C1B50E700022BC6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9642FA231C1B50E700022BC6 /* LaunchScreen.storyboard */; };
9642FA331C1B909700022BC6 /* SideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9642FA321C1B909700022BC6 /* SideViewController.swift */; };
9642FA331C1B909700022BC6 /* LeftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9642FA321C1B909700022BC6 /* LeftViewController.swift */; };
967585351C5692A4001E4268 /* Material.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 967585341C5692A4001E4268 /* Material.framework */; };
967585361C5692A4001E4268 /* Material.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 967585341C5692A4001E4268 /* Material.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
967585381C569AA9001E4268 /* RightViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967585371C569AA9001E4268 /* RightViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
......@@ -21,6 +24,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
967585361C5692A4001E4268 /* Material.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
......@@ -34,7 +38,9 @@
9642FA211C1B50E700022BC6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
9642FA241C1B50E700022BC6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
9642FA261C1B50E700022BC6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9642FA321C1B909700022BC6 /* SideViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideViewController.swift; sourceTree = "<group>"; };
9642FA321C1B909700022BC6 /* LeftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftViewController.swift; sourceTree = "<group>"; };
967585341C5692A4001E4268 /* Material.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = Material.framework; path = "/Users/danieldahan/Library/Developer/Xcode/DerivedData/Material-hbpnflxhoouqxebjcyhbbhqyesjd/Build/Products/Debug-iphoneos/Material.framework"; sourceTree = "<absolute>"; };
967585371C569AA9001E4268 /* RightViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RightViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
......@@ -42,6 +48,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
967585351C5692A4001E4268 /* Material.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -51,6 +58,7 @@
9642FA0E1C1B50E700022BC6 = {
isa = PBXGroup;
children = (
967585341C5692A4001E4268 /* Material.framework */,
9642FA191C1B50E700022BC6 /* SideNavigationViewController */,
9642FA181C1B50E700022BC6 /* Products */,
);
......@@ -69,10 +77,11 @@
children = (
9642FA1A1C1B50E700022BC6 /* AppDelegate.swift */,
9642FA1C1C1B50E700022BC6 /* MainViewController.swift */,
9642FA321C1B909700022BC6 /* SideViewController.swift */,
9642FA321C1B909700022BC6 /* LeftViewController.swift */,
9642FA211C1B50E700022BC6 /* Assets.xcassets */,
9642FA231C1B50E700022BC6 /* LaunchScreen.storyboard */,
9642FA261C1B50E700022BC6 /* Info.plist */,
967585371C569AA9001E4268 /* RightViewController.swift */,
);
path = SideNavigationViewController;
sourceTree = "<group>";
......@@ -149,7 +158,8 @@
buildActionMask = 2147483647;
files = (
9642FA1D1C1B50E700022BC6 /* MainViewController.swift in Sources */,
9642FA331C1B909700022BC6 /* SideViewController.swift in Sources */,
967585381C569AA9001E4268 /* RightViewController.swift in Sources */,
9642FA331C1B909700022BC6 /* LeftViewController.swift in Sources */,
9642FA1B1C1B50E700022BC6 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
......
......@@ -39,7 +39,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window!.rootViewController = SideNavigationViewController(mainViewController: MainViewController(), sideViewController: SideViewController())
window!.rootViewController = SideNavigationViewController(mainViewController: MainViewController(), leftViewController: LeftViewController())
window!.makeKeyAndVisible()
return true
}
......
......@@ -29,7 +29,7 @@
*/
/*
The following is an example of setting a UITableView as the SideViewController
The following is an example of setting a UITableView as the LeftViewController
within a SideNavigationViewController.
*/
......@@ -42,7 +42,7 @@ private struct Item {
var selected: Bool
}
class SideViewController: UIViewController {
class LeftViewController: UIViewController {
/// A tableView used to display navigation items.
private let tableView: UITableView = UITableView()
......@@ -64,8 +64,8 @@ class SideViewController: UIViewController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
sideNavigationViewController?.backdropColor = nil
sideNavigationViewController?.depth = .None
// sideNavigationViewController?.backdropColor = nil
// sideNavigationViewController?.depth = .None
}
......@@ -137,7 +137,7 @@ class SideViewController: UIViewController {
}
/// TableViewDataSource methods.
extension SideViewController: UITableViewDataSource {
extension LeftViewController: UITableViewDataSource {
/// Determines the number of rows in the tableView.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count;
......@@ -164,7 +164,7 @@ extension SideViewController: UITableViewDataSource {
}
/// UITableViewDelegate methods.
extension SideViewController: UITableViewDelegate {
extension LeftViewController: UITableViewDelegate {
/// Sets the tableView cell height.
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 64
......
......@@ -69,7 +69,7 @@ class MainViewController: UIViewController {
because any earlier may cause a race condition when instantiating
the MainViewController and SideViewController.
*/
sideNavigationViewController?.setSideViewWidth(view.bounds.width - 88, hidden: true, animated: false)
sideNavigationViewController?.setLeftViewWidth(view.bounds.width - 88, hidden: true, animated: false)
}
/**
......
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Material nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
The following is an example of setting a UITableView as the RightViewController
within a SideNavigationViewController.
*/
import UIKit
import Material
private struct Item {
var text: String
var imageName: String
var selected: Bool
}
class RightViewController: UIViewController {
/// A tableView used to display navigation items.
private let tableView: UITableView = UITableView()
/// A list of all the navigation items.
private var items: Array<Item> = Array<Item>()
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
prepareItems()
prepareProfileView()
prepareTableView()
}
/// General preparation statements.
private func prepareView() {
view.backgroundColor = MaterialColor.clear
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
// sideNavigationViewController?.backdropColor = nil
// sideNavigationViewController?.depth = .None
}
/// Prepares the items that are displayed within the tableView.
private func prepareItems() {
items.append(Item(text: "Inbox", imageName: "ic_inbox", selected: true))
items.append(Item(text: "Today", imageName: "ic_today", selected: false))
items.append(Item(text: "Bookmarks", imageName: "ic_book", selected: false))
items.append(Item(text: "Work", imageName: "ic_work", selected: false))
items.append(Item(text: "Contacts", imageName: "ic_contacts", selected: false))
items.append(Item(text: "Settings", imageName: "ic_settings", selected: false))
}
/// Prepares profile view.
private func prepareProfileView() {
let backgroundView: MaterialView = MaterialView()
backgroundView.image = UIImage(named: "ProfileSideNavBackground")
let profileView: MaterialView = MaterialView()
profileView.image = UIImage(named: "Profile9")?.resize(toWidth: 72)
profileView.shape = .Circle
profileView.borderColor = MaterialColor.white
profileView.borderWidth = .Border3
let nameLabel: UILabel = UILabel()
nameLabel.text = "Michael Smith"
nameLabel.textColor = MaterialColor.white
nameLabel.font = RobotoFont.mediumWithSize(18)
view.addSubview(backgroundView)
backgroundView.translatesAutoresizingMaskIntoConstraints = false
MaterialLayout.alignFromTop(view, child: backgroundView)
MaterialLayout.alignToParentHorizontally(view, child: backgroundView)
MaterialLayout.height(view, child: backgroundView, height: 170)
backgroundView.addSubview(profileView)
profileView.translatesAutoresizingMaskIntoConstraints = false
MaterialLayout.alignFromTopLeft(backgroundView, child: profileView, top: 20, left: 20)
MaterialLayout.size(backgroundView, child: profileView, width: 72, height: 72)
backgroundView.addSubview(nameLabel)
nameLabel.translatesAutoresizingMaskIntoConstraints = false
MaterialLayout.alignFromBottom(backgroundView, child: nameLabel, bottom: 20)
MaterialLayout.alignToParentHorizontally(backgroundView, child: nameLabel, left: 20, right: 20)
}
/// Prepares the tableView.
private func prepareTableView() {
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.dataSource = self
tableView.delegate = self
tableView.separatorStyle = .None
// if !UIAccessibilityIsReduceTransparencyEnabled() {
// tableView.backgroundColor = MaterialColor.clear
// let blurEffect = UIBlurEffect(style: .Light)
// let blurEffectView = UIVisualEffectView(effect: blurEffect)
// tableView.backgroundView = blurEffectView
//
// //if you want translucent vibrant table view separator lines
// tableView.separatorEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
// }
// Use MaterialLayout to easily align the tableView.
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
MaterialLayout.alignToParent(view, child: tableView, top: 170)
}
}
/// TableViewDataSource methods.
extension RightViewController: UITableViewDataSource {
/// Determines the number of rows in the tableView.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count;
}
/// Prepares the cells within the tableView.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.backgroundColor = MaterialColor.clear
let item: Item = items[indexPath.row]
cell.selectionStyle = .None
cell.textLabel!.text = item.text
cell.textLabel!.font = RobotoFont.medium
cell.imageView!.image = UIImage(named: item.imageName)?.imageWithRenderingMode(.AlwaysTemplate)
cell.imageView!.tintColor = MaterialColor.cyan.darken4
if item.selected {
cell.textLabel!.textColor = MaterialColor.cyan.base
}
return cell
}
}
/// UITableViewDelegate methods.
extension RightViewController: UITableViewDelegate {
/// Sets the tableView cell height.
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 64
}
}
......@@ -103,7 +103,7 @@ public protocol SideNavigationViewControllerDelegate {
public class SideNavigationViewController: UIViewController, UIGestureRecognizerDelegate {
/**
A CGPoint property that is used internally to track
the original position of the sideView when panning began.
the original position of the leftView when panning began.
*/
private var originalPosition: CGPoint = CGPointZero
......@@ -131,9 +131,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
A CGFloat property that accesses the horizontal threshold of
the SideNavigationViewController. When the panning gesture has
ended, if the position is beyond the horizontal threshold,
the sideView is opened, if it is below the threshold, the
sideView is closed. The horizontal threshold is always at half
the width of the sideView.
the leftView is opened, if it is below the threshold, the
leftView is closed. The horizontal threshold is always at half
the width of the leftView.
*/
public private(set) var horizontalThreshold: CGFloat = 0
......@@ -158,12 +158,12 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/**
A CGFloat property that sets the animation duration of the
sideView when closing and opening. Defaults to 0.25.
leftView when closing and opening. Defaults to 0.25.
*/
public var animationDuration: CGFloat = 0.25
/**
A Boolean property that enables and disables the sideView from
A Boolean property that enables and disables the leftView from
opening and closing. Defaults to true.
*/
public var enabled: Bool = true {
......@@ -179,22 +179,22 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/**
A Boolean property that triggers the status bar to be hidden
when the sideView is opened. Defaults to true.
when the leftView is opened. Defaults to true.
*/
public var hideStatusBar: Bool = true
/**
A MaterialDepth property that is used to set the depth of the
sideView when opened.
leftView when opened.
*/
public var depth: MaterialDepth = .Depth2
/**
A MaterialView property that is used to hide and reveal the
sideViewController. It is very rare that this property will
leftViewController. It is very rare that this property will
need to be accessed externally.
*/
public private(set) var sideView: MaterialView!
public private(set) var leftView: MaterialView!
/// A CGFloat property to set the backdropLayer color opacity.
public var backdropOpacity: CGFloat = 0.5 {
......@@ -211,11 +211,11 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
}
/**
A Boolean property that indicates whether the sideView
A Boolean property that indicates whether the leftView
is opened.
*/
public var opened: Bool {
return sideView.x != -sideViewWidth
return leftView.x != -leftViewWidth
}
/**
......@@ -228,25 +228,33 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/**
A UIViewController property that references the
active side UIViewController.
active left UIViewController.
*/
public private(set) var sideViewController: UIViewController!
public private(set) var leftViewController: UIViewController?
/**
A CGFloat property to access the width the sideView
A UIViewController property that references the
active right UIViewController.
*/
public private(set) var rightViewController: UIViewController?
/**
A CGFloat property to access the width the leftView
opens up to.
*/
public private(set) var sideViewWidth: CGFloat = 240
public private(set) var leftViewWidth: CGFloat = 240
/**
An initializer for the SideNavigationViewController.
- Parameter mainViewController: The main UIViewController.
- Parameter sideViewController: The side UIViewController.
- Parameter leftViewController: The left UIViewController.
- Parameter rightViewController: The right UIViewController.
*/
public convenience init(mainViewController: UIViewController, sideViewController: UIViewController) {
public convenience init(mainViewController: UIViewController, leftViewController: UIViewController? = nil, rightViewController: UIViewController? = nil) {
self.init()
self.mainViewController = mainViewController
self.sideViewController = sideViewController
self.leftViewController = leftViewController
self.rightViewController = rightViewController
prepareView()
}
......@@ -254,13 +262,13 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
super.viewWillLayoutSubviews()
MaterialAnimation.animationDisabled { [unowned self] in
self.backdropLayer.frame = self.view.bounds
self.sideView.width = self.sideViewWidth
self.sideView.height = self.view.bounds.height
self.leftView.width = self.leftViewWidth
self.leftView.height = self.view.bounds.height
}
horizontalThreshold = sideViewWidth / 2
sideViewController.view.frame.size.width = sideView.width
sideViewController.view.frame.size.height = sideView.height
sideViewController.view.center = CGPointMake(sideView.width / 2, sideView.height / 2)
horizontalThreshold = leftViewWidth / 2
leftViewController?.view.frame.size.width = leftView.width
leftViewController?.view.frame.size.height = leftView.height
leftViewController?.view.center = CGPointMake(leftView.width / 2, leftView.height / 2)
}
/**
......@@ -298,50 +306,50 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
}
/**
A method that is used to set the width of the sideView when
opened. This is the recommended method of setting the sideView
A method that is used to set the width of the leftView when
opened. This is the recommended method of setting the leftView
width.
- Parameter width: A CGFloat value to set as the new width.
- Parameter hidden: A Boolean value of whether the sideView
- Parameter hidden: A Boolean value of whether the leftView
should be hidden after the width has been updated or not.
- Parameter animated: A Boolean value that indicates to animate
the sideView width change.
the leftView width change.
*/
public func setSideViewWidth(width: CGFloat, hidden: Bool, animated: Bool) {
public func setLeftViewWidth(width: CGFloat, hidden: Bool, animated: Bool) {
let w: CGFloat = (hidden ? -width : width) / 2
sideViewWidth = width
leftViewWidth = width
if animated {
MaterialAnimation.animateWithDuration(0.25, animations: { [unowned self] in
self.sideView.width = width
self.sideView.position.x = w
self.leftView.width = width
self.leftView.position.x = w
}) { [unowned self] in
self.userInteractionEnabled = false
}
} else {
MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.width = width
self.sideView.position.x = w
self.leftView.width = width
self.leftView.position.x = w
}
}
}
/**
A method that toggles the sideView opened if previously closed,
A method that toggles the leftView opened if previously closed,
or closed if previously opened.
- Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the
sideView. Defaults to 0.
leftView. Defaults to 0.
*/
public func toggle(velocity: CGFloat = 0) {
opened ? close(velocity) : open(velocity)
}
/**
A method that opens the sideView.
A method that opens the leftView.
- Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the
sideView. Defaults to 0.
leftView. Defaults to 0.
*/
public func open(velocity: CGFloat = 0) {
toggleStatusBar(true)
......@@ -349,9 +357,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
delegate?.sideNavigationViewWillOpen?(self)
MaterialAnimation.animateWithDuration(Double(0 == velocity ? animationDuration : fmax(0.1, fmin(1, Double(sideView.x / velocity)))),
MaterialAnimation.animateWithDuration(Double(0 == velocity ? animationDuration : fmax(0.1, fmin(1, Double(leftView.x / velocity)))),
animations: { [unowned self] in
self.sideView.position = CGPointMake(self.sideView.width / 2, self.sideView.height / 2)
self.leftView.position = CGPointMake(self.leftView.width / 2, self.leftView.height / 2)
}) { [unowned self] in
self.userInteractionEnabled = false
self.showSideViewDepth()
......@@ -360,10 +368,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
}
/**
A method that closes the sideView.
A method that closes the leftView.
- Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the
sideView. Defaults to 0.
leftView. Defaults to 0.
*/
public func close(velocity: CGFloat = 0) {
toggleStatusBar(false)
......@@ -371,9 +379,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
delegate?.sideNavigationViewWillClose?(self)
MaterialAnimation.animateWithDuration(Double(0 == velocity ? animationDuration : fmax(0.1, fmin(1, Double(sideView.x / velocity)))),
MaterialAnimation.animateWithDuration(Double(0 == velocity ? animationDuration : fmax(0.1, fmin(1, Double(leftView.x / velocity)))),
animations: { [unowned self] in
self.sideView.position = CGPointMake(-self.sideView.width / 2, self.sideView.height / 2)
self.leftView.position = CGPointMake(-self.leftView.width / 2, self.leftView.height / 2)
}) { [unowned self] in
self.userInteractionEnabled = true
self.hideSideViewDepth()
......@@ -389,7 +397,7 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
if opened && gestureRecognizer == sideTapGesture {
let point: CGPoint = touch.locationInView(view)
delegate?.sideNavigationViewDidTap?(self, point: point)
return !isPointContainedWithinViewController(sideView, point: point)
return !isPointContainedWithinViewController(leftView, point: point)
}
}
return false
......@@ -405,25 +413,25 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
switch recognizer.state {
case .Began:
backdropLayer.hidden = false
originalPosition = sideView.position
originalPosition = leftView.position
toggleStatusBar(true)
showSideViewDepth()
delegate?.sideNavigationViewPanDidBegin?(self, point: sideView.position)
delegate?.sideNavigationViewPanDidBegin?(self, point: leftView.position)
case .Changed:
let translation: CGPoint = recognizer.translationInView(sideView)
let w: CGFloat = sideView.width
let translation: CGPoint = recognizer.translationInView(leftView)
let w: CGFloat = leftView.width
MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.position.x = self.originalPosition.x + translation.x > (w / 2) ? (w / 2) : self.originalPosition.x + translation.x
self.delegate?.sideNavigationViewPanDidChange?(self, point: self.sideView.position)
self.leftView.position.x = self.originalPosition.x + translation.x > (w / 2) ? (w / 2) : self.originalPosition.x + translation.x
self.delegate?.sideNavigationViewPanDidChange?(self, point: self.leftView.position)
}
case .Ended, .Cancelled, .Failed:
let point: CGPoint = recognizer.velocityInView(recognizer.view)
let x: CGFloat = point.x >= 1000 || point.x <= -1000 ? point.x : 0
delegate?.sideNavigationViewPanDidEnd?(self, point: sideView.position)
delegate?.sideNavigationViewPanDidEnd?(self, point: leftView.position)
if sideView.x <= CGFloat(floor(-sideViewWidth)) + horizontalThreshold || point.x <= -1000 {
if leftView.x <= CGFloat(floor(-leftViewWidth)) + horizontalThreshold || point.x <= -1000 {
close(x)
} else {
open(x)
......@@ -462,28 +470,36 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
}
/**
A method that prepares the sideViewController.
A method that prepares the leftViewController.
*/
private func prepareSideViewController() {
sideViewController.view.clipsToBounds = true
prepareViewControllerWithinContainer(sideViewController, container: sideView)
private func prepareLeftViewController() {
leftViewController?.view.clipsToBounds = true
prepareViewControllerWithinContainer(leftViewController, container: leftView)
}
/**
A method that prepares the sideView.
A method that prepares the rightViewController.
*/
private func prepareRightViewController() {
rightViewController?.view.clipsToBounds = true
prepareViewControllerWithinContainer(rightViewController, container: leftView)
}
/**
A method that prepares the leftView.
*/
private func prepareSideView() {
sideView = MaterialView()
sideView.frame = CGRectMake(0, 0, sideViewWidth, view.frame.height)
sideView.backgroundColor = MaterialColor.clear
view.addSubview(sideView)
leftView = MaterialView()
leftView.frame = CGRectMake(0, 0, leftViewWidth, view.frame.height)
leftView.backgroundColor = MaterialColor.clear
view.addSubview(leftView)
MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.position.x = -self.sideViewWidth / 2
self.sideView.zPosition = 1000
self.leftView.position.x = -self.leftViewWidth / 2
self.leftView.zPosition = 1000
}
prepareSideViewController()
prepareLeftViewController()
removeGestures(&sidePanGesture, tap: &sideTapGesture)
prepareGestures(&sidePanGesture, panSelector: "handlePanGesture:", tap: &sideTapGesture, tapSelector: "handleTapGesture:")
}
......@@ -502,14 +518,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
A method that adds the passed in controller as a child of
the SideNavigationViewController within the passed in
container view.
- Parameter controller: A UIViewController to add as a child.
- Parameter viewController: A UIViewController to add as a child.
- Parameter container: A UIView that is the parent of the
passed in controller view within the view hierarchy.
*/
private func prepareViewControllerWithinContainer(controller: UIViewController, container: UIView) {
addChildViewController(controller)
container.addSubview(controller.view)
controller.didMoveToParentViewController(self)
private func prepareViewControllerWithinContainer(viewController: UIViewController?, container: UIView) {
if let v: UIViewController = viewController {
addChildViewController(v)
container.addSubview(v.view)
v.didMoveToParentViewController(self)
}
}
/**
......@@ -597,21 +615,21 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
}
/**
A method that adds the depth to the sideView depth property.
A method that adds the depth to the leftView depth property.
*/
private func showSideViewDepth() {
MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.depth = self.depth
self.leftView.depth = self.depth
}
}
/**
A method that removes the depth from the sideView depth
A method that removes the depth from the leftView depth
property.
*/
private func hideSideViewDepth() {
MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.depth = .None
self.leftView.depth = .None
}
}
}
\ No newline at end of file
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