Commit 80768582 by Daniel Dahan

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

parent 9d14b588
...@@ -11,7 +11,10 @@ ...@@ -11,7 +11,10 @@
9642FA1D1C1B50E700022BC6 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9642FA1C1C1B50E700022BC6 /* MainViewController.swift */; }; 9642FA1D1C1B50E700022BC6 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9642FA1C1C1B50E700022BC6 /* MainViewController.swift */; };
9642FA221C1B50E700022BC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9642FA211C1B50E700022BC6 /* Assets.xcassets */; }; 9642FA221C1B50E700022BC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9642FA211C1B50E700022BC6 /* Assets.xcassets */; };
9642FA251C1B50E700022BC6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9642FA231C1B50E700022BC6 /* LaunchScreen.storyboard */; }; 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 */ /* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
...@@ -21,6 +24,7 @@ ...@@ -21,6 +24,7 @@
dstPath = ""; dstPath = "";
dstSubfolderSpec = 10; dstSubfolderSpec = 10;
files = ( files = (
967585361C5692A4001E4268 /* Material.framework in Embed Frameworks */,
); );
name = "Embed Frameworks"; name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
...@@ -34,7 +38,9 @@ ...@@ -34,7 +38,9 @@
9642FA211C1B50E700022BC6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -42,6 +48,7 @@ ...@@ -42,6 +48,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
967585351C5692A4001E4268 /* Material.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -51,6 +58,7 @@ ...@@ -51,6 +58,7 @@
9642FA0E1C1B50E700022BC6 = { 9642FA0E1C1B50E700022BC6 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
967585341C5692A4001E4268 /* Material.framework */,
9642FA191C1B50E700022BC6 /* SideNavigationViewController */, 9642FA191C1B50E700022BC6 /* SideNavigationViewController */,
9642FA181C1B50E700022BC6 /* Products */, 9642FA181C1B50E700022BC6 /* Products */,
); );
...@@ -69,10 +77,11 @@ ...@@ -69,10 +77,11 @@
children = ( children = (
9642FA1A1C1B50E700022BC6 /* AppDelegate.swift */, 9642FA1A1C1B50E700022BC6 /* AppDelegate.swift */,
9642FA1C1C1B50E700022BC6 /* MainViewController.swift */, 9642FA1C1C1B50E700022BC6 /* MainViewController.swift */,
9642FA321C1B909700022BC6 /* SideViewController.swift */, 9642FA321C1B909700022BC6 /* LeftViewController.swift */,
9642FA211C1B50E700022BC6 /* Assets.xcassets */, 9642FA211C1B50E700022BC6 /* Assets.xcassets */,
9642FA231C1B50E700022BC6 /* LaunchScreen.storyboard */, 9642FA231C1B50E700022BC6 /* LaunchScreen.storyboard */,
9642FA261C1B50E700022BC6 /* Info.plist */, 9642FA261C1B50E700022BC6 /* Info.plist */,
967585371C569AA9001E4268 /* RightViewController.swift */,
); );
path = SideNavigationViewController; path = SideNavigationViewController;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -149,7 +158,8 @@ ...@@ -149,7 +158,8 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
9642FA1D1C1B50E700022BC6 /* MainViewController.swift in Sources */, 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 */, 9642FA1B1C1B50E700022BC6 /* AppDelegate.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
......
...@@ -39,7 +39,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -39,7 +39,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
window = UIWindow(frame: UIScreen.mainScreen().bounds) window = UIWindow(frame: UIScreen.mainScreen().bounds)
window!.rootViewController = SideNavigationViewController(mainViewController: MainViewController(), sideViewController: SideViewController()) window!.rootViewController = SideNavigationViewController(mainViewController: MainViewController(), leftViewController: LeftViewController())
window!.makeKeyAndVisible() window!.makeKeyAndVisible()
return true return true
} }
......
...@@ -29,7 +29,7 @@ ...@@ -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. within a SideNavigationViewController.
*/ */
...@@ -42,7 +42,7 @@ private struct Item { ...@@ -42,7 +42,7 @@ private struct Item {
var selected: Bool var selected: Bool
} }
class SideViewController: UIViewController { class LeftViewController: UIViewController {
/// A tableView used to display navigation items. /// A tableView used to display navigation items.
private let tableView: UITableView = UITableView() private let tableView: UITableView = UITableView()
...@@ -64,8 +64,8 @@ class SideViewController: UIViewController { ...@@ -64,8 +64,8 @@ class SideViewController: UIViewController {
override func viewWillAppear(animated: Bool) { override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
sideNavigationViewController?.backdropColor = nil // sideNavigationViewController?.backdropColor = nil
sideNavigationViewController?.depth = .None // sideNavigationViewController?.depth = .None
} }
...@@ -137,7 +137,7 @@ class SideViewController: UIViewController { ...@@ -137,7 +137,7 @@ class SideViewController: UIViewController {
} }
/// TableViewDataSource methods. /// TableViewDataSource methods.
extension SideViewController: UITableViewDataSource { extension LeftViewController: UITableViewDataSource {
/// Determines the number of rows in the tableView. /// Determines the number of rows in the tableView.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count; return items.count;
...@@ -164,7 +164,7 @@ extension SideViewController: UITableViewDataSource { ...@@ -164,7 +164,7 @@ extension SideViewController: UITableViewDataSource {
} }
/// UITableViewDelegate methods. /// UITableViewDelegate methods.
extension SideViewController: UITableViewDelegate { extension LeftViewController: UITableViewDelegate {
/// Sets the tableView cell height. /// Sets the tableView cell height.
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 64 return 64
......
...@@ -69,7 +69,7 @@ class MainViewController: UIViewController { ...@@ -69,7 +69,7 @@ class MainViewController: UIViewController {
because any earlier may cause a race condition when instantiating because any earlier may cause a race condition when instantiating
the MainViewController and SideViewController. 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 { ...@@ -103,7 +103,7 @@ public protocol SideNavigationViewControllerDelegate {
public class SideNavigationViewController: UIViewController, UIGestureRecognizerDelegate { public class SideNavigationViewController: UIViewController, UIGestureRecognizerDelegate {
/** /**
A CGPoint property that is used internally to track 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 private var originalPosition: CGPoint = CGPointZero
...@@ -131,9 +131,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -131,9 +131,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
A CGFloat property that accesses the horizontal threshold of A CGFloat property that accesses the horizontal threshold of
the SideNavigationViewController. When the panning gesture has the SideNavigationViewController. When the panning gesture has
ended, if the position is beyond the horizontal threshold, ended, if the position is beyond the horizontal threshold,
the sideView is opened, if it is below the threshold, the the leftView is opened, if it is below the threshold, the
sideView is closed. The horizontal threshold is always at half leftView is closed. The horizontal threshold is always at half
the width of the sideView. the width of the leftView.
*/ */
public private(set) var horizontalThreshold: CGFloat = 0 public private(set) var horizontalThreshold: CGFloat = 0
...@@ -158,12 +158,12 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -158,12 +158,12 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/** /**
A CGFloat property that sets the animation duration of the 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 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. opening and closing. Defaults to true.
*/ */
public var enabled: Bool = true { public var enabled: Bool = true {
...@@ -179,22 +179,22 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -179,22 +179,22 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/** /**
A Boolean property that triggers the status bar to be hidden 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 public var hideStatusBar: Bool = true
/** /**
A MaterialDepth property that is used to set the depth of the A MaterialDepth property that is used to set the depth of the
sideView when opened. leftView when opened.
*/ */
public var depth: MaterialDepth = .Depth2 public var depth: MaterialDepth = .Depth2
/** /**
A MaterialView property that is used to hide and reveal the 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. 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. /// A CGFloat property to set the backdropLayer color opacity.
public var backdropOpacity: CGFloat = 0.5 { public var backdropOpacity: CGFloat = 0.5 {
...@@ -211,11 +211,11 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -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. is opened.
*/ */
public var opened: Bool { public var opened: Bool {
return sideView.x != -sideViewWidth return leftView.x != -leftViewWidth
} }
/** /**
...@@ -228,25 +228,33 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -228,25 +228,33 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
/** /**
A UIViewController property that references the 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. opens up to.
*/ */
public private(set) var sideViewWidth: CGFloat = 240 public private(set) var leftViewWidth: CGFloat = 240
/** /**
An initializer for the SideNavigationViewController. An initializer for the SideNavigationViewController.
- Parameter mainViewController: The main UIViewController. - 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.init()
self.mainViewController = mainViewController self.mainViewController = mainViewController
self.sideViewController = sideViewController self.leftViewController = leftViewController
self.rightViewController = rightViewController
prepareView() prepareView()
} }
...@@ -254,13 +262,13 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -254,13 +262,13 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
super.viewWillLayoutSubviews() super.viewWillLayoutSubviews()
MaterialAnimation.animationDisabled { [unowned self] in MaterialAnimation.animationDisabled { [unowned self] in
self.backdropLayer.frame = self.view.bounds self.backdropLayer.frame = self.view.bounds
self.sideView.width = self.sideViewWidth self.leftView.width = self.leftViewWidth
self.sideView.height = self.view.bounds.height self.leftView.height = self.view.bounds.height
} }
horizontalThreshold = sideViewWidth / 2 horizontalThreshold = leftViewWidth / 2
sideViewController.view.frame.size.width = sideView.width leftViewController?.view.frame.size.width = leftView.width
sideViewController.view.frame.size.height = sideView.height leftViewController?.view.frame.size.height = leftView.height
sideViewController.view.center = CGPointMake(sideView.width / 2, sideView.height / 2) leftViewController?.view.center = CGPointMake(leftView.width / 2, leftView.height / 2)
} }
/** /**
...@@ -298,50 +306,50 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -298,50 +306,50 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
} }
/** /**
A method that is used to set the width of the sideView when A method that is used to set the width of the leftView when
opened. This is the recommended method of setting the sideView opened. This is the recommended method of setting the leftView
width. width.
- Parameter width: A CGFloat value to set as the new 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. should be hidden after the width has been updated or not.
- Parameter animated: A Boolean value that indicates to animate - 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 let w: CGFloat = (hidden ? -width : width) / 2
sideViewWidth = width leftViewWidth = width
if animated { if animated {
MaterialAnimation.animateWithDuration(0.25, animations: { [unowned self] in MaterialAnimation.animateWithDuration(0.25, animations: { [unowned self] in
self.sideView.width = width self.leftView.width = width
self.sideView.position.x = w self.leftView.position.x = w
}) { [unowned self] in }) { [unowned self] in
self.userInteractionEnabled = false self.userInteractionEnabled = false
} }
} else { } else {
MaterialAnimation.animationDisabled { [unowned self] in MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.width = width self.leftView.width = width
self.sideView.position.x = w 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. or closed if previously opened.
- Parameter velocity: A CGFloat value that sets the - Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the velocity of the user interaction when animating the
sideView. Defaults to 0. leftView. Defaults to 0.
*/ */
public func toggle(velocity: CGFloat = 0) { public func toggle(velocity: CGFloat = 0) {
opened ? close(velocity) : open(velocity) 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 - Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the velocity of the user interaction when animating the
sideView. Defaults to 0. leftView. Defaults to 0.
*/ */
public func open(velocity: CGFloat = 0) { public func open(velocity: CGFloat = 0) {
toggleStatusBar(true) toggleStatusBar(true)
...@@ -349,9 +357,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -349,9 +357,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
delegate?.sideNavigationViewWillOpen?(self) 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 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 }) { [unowned self] in
self.userInteractionEnabled = false self.userInteractionEnabled = false
self.showSideViewDepth() self.showSideViewDepth()
...@@ -360,10 +368,10 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -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 - Parameter velocity: A CGFloat value that sets the
velocity of the user interaction when animating the velocity of the user interaction when animating the
sideView. Defaults to 0. leftView. Defaults to 0.
*/ */
public func close(velocity: CGFloat = 0) { public func close(velocity: CGFloat = 0) {
toggleStatusBar(false) toggleStatusBar(false)
...@@ -371,9 +379,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -371,9 +379,9 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
delegate?.sideNavigationViewWillClose?(self) 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 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 }) { [unowned self] in
self.userInteractionEnabled = true self.userInteractionEnabled = true
self.hideSideViewDepth() self.hideSideViewDepth()
...@@ -389,7 +397,7 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -389,7 +397,7 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
if opened && gestureRecognizer == sideTapGesture { if opened && gestureRecognizer == sideTapGesture {
let point: CGPoint = touch.locationInView(view) let point: CGPoint = touch.locationInView(view)
delegate?.sideNavigationViewDidTap?(self, point: point) delegate?.sideNavigationViewDidTap?(self, point: point)
return !isPointContainedWithinViewController(sideView, point: point) return !isPointContainedWithinViewController(leftView, point: point)
} }
} }
return false return false
...@@ -405,25 +413,25 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -405,25 +413,25 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
switch recognizer.state { switch recognizer.state {
case .Began: case .Began:
backdropLayer.hidden = false backdropLayer.hidden = false
originalPosition = sideView.position originalPosition = leftView.position
toggleStatusBar(true) toggleStatusBar(true)
showSideViewDepth() showSideViewDepth()
delegate?.sideNavigationViewPanDidBegin?(self, point: sideView.position) delegate?.sideNavigationViewPanDidBegin?(self, point: leftView.position)
case .Changed: case .Changed:
let translation: CGPoint = recognizer.translationInView(sideView) let translation: CGPoint = recognizer.translationInView(leftView)
let w: CGFloat = sideView.width let w: CGFloat = leftView.width
MaterialAnimation.animationDisabled { [unowned self] in MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.position.x = self.originalPosition.x + translation.x > (w / 2) ? (w / 2) : self.originalPosition.x + translation.x self.leftView.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.delegate?.sideNavigationViewPanDidChange?(self, point: self.leftView.position)
} }
case .Ended, .Cancelled, .Failed: case .Ended, .Cancelled, .Failed:
let point: CGPoint = recognizer.velocityInView(recognizer.view) let point: CGPoint = recognizer.velocityInView(recognizer.view)
let x: CGFloat = point.x >= 1000 || point.x <= -1000 ? point.x : 0 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) close(x)
} else { } else {
open(x) open(x)
...@@ -462,28 +470,36 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -462,28 +470,36 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
} }
/** /**
A method that prepares the sideViewController. A method that prepares the leftViewController.
*/ */
private func prepareSideViewController() { private func prepareLeftViewController() {
sideViewController.view.clipsToBounds = true leftViewController?.view.clipsToBounds = true
prepareViewControllerWithinContainer(sideViewController, container: sideView) 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() { private func prepareSideView() {
sideView = MaterialView() leftView = MaterialView()
sideView.frame = CGRectMake(0, 0, sideViewWidth, view.frame.height) leftView.frame = CGRectMake(0, 0, leftViewWidth, view.frame.height)
sideView.backgroundColor = MaterialColor.clear leftView.backgroundColor = MaterialColor.clear
view.addSubview(sideView) view.addSubview(leftView)
MaterialAnimation.animationDisabled { [unowned self] in MaterialAnimation.animationDisabled { [unowned self] in
self.sideView.position.x = -self.sideViewWidth / 2 self.leftView.position.x = -self.leftViewWidth / 2
self.sideView.zPosition = 1000 self.leftView.zPosition = 1000
} }
prepareSideViewController() prepareLeftViewController()
removeGestures(&sidePanGesture, tap: &sideTapGesture) removeGestures(&sidePanGesture, tap: &sideTapGesture)
prepareGestures(&sidePanGesture, panSelector: "handlePanGesture:", tap: &sideTapGesture, tapSelector: "handleTapGesture:") prepareGestures(&sidePanGesture, panSelector: "handlePanGesture:", tap: &sideTapGesture, tapSelector: "handleTapGesture:")
} }
...@@ -502,14 +518,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -502,14 +518,16 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer
A method that adds the passed in controller as a child of A method that adds the passed in controller as a child of
the SideNavigationViewController within the passed in the SideNavigationViewController within the passed in
container view. 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 - Parameter container: A UIView that is the parent of the
passed in controller view within the view hierarchy. passed in controller view within the view hierarchy.
*/ */
private func prepareViewControllerWithinContainer(controller: UIViewController, container: UIView) { private func prepareViewControllerWithinContainer(viewController: UIViewController?, container: UIView) {
addChildViewController(controller) if let v: UIViewController = viewController {
container.addSubview(controller.view) addChildViewController(v)
controller.didMoveToParentViewController(self) container.addSubview(v.view)
v.didMoveToParentViewController(self)
}
} }
/** /**
...@@ -597,21 +615,21 @@ public class SideNavigationViewController: UIViewController, UIGestureRecognizer ...@@ -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() { private func showSideViewDepth() {
MaterialAnimation.animationDisabled { [unowned self] in 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. property.
*/ */
private func hideSideViewDepth() { private func hideSideViewDepth() {
MaterialAnimation.animationDisabled { [unowned self] in 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