-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSideBarMenu.swift
More file actions
132 lines (96 loc) · 5.33 KB
/
SideBarMenu.swift
File metadata and controls
132 lines (96 loc) · 5.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// SideBarMenu.swift
// DynamicsDemo
//
// Created by Stefan Buretea on 3/31/15.
// Copyright (c) 2015 Stefan Buretea. All rights reserved.
//
import UIKit
@objc protocol SideBarMenuDelegate {
func didSelectItemAtIndex(index: Int)
optional func menuWillClose()
optional func menuWillOpen()
}
class SideBarMenu: NSObject, SideBarMenuViewControllerDelegate {
private let barWidth: CGFloat = 150
private let sideBarTableViewInset: CGFloat = 64.0
private let sideBarContainerView: UIView = UIView()
private let sideBarViewController: SideBarMenuTableViewController = SideBarMenuTableViewController()
private var originView: UIView!
var animator: UIDynamicAnimator!
var delegate: SideBarMenuDelegate?
var isOpen: Bool = false
override init() {
super.init()
}
init(sourceView: UIView, menuItems: Array<String>, menuImages: Array<String>) {
super.init()
self.originView = sourceView
self.sideBarViewController.tableData = menuItems
self.sideBarViewController.tableDataImages = menuImages
setup()
self.animator = UIDynamicAnimator(referenceView: self.originView)
let showGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
showGestureRecognizer.direction = UISwipeGestureRecognizerDirection.Right
self.originView.addGestureRecognizer(showGestureRecognizer)
let hideGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
hideGestureRecognizer.direction = UISwipeGestureRecognizerDirection.Left
self.originView.addGestureRecognizer(hideGestureRecognizer)
}
func setup() {
self.sideBarContainerView.frame = CGRectMake(-self.barWidth - 1, self.originView.frame.origin.y, self.barWidth, self.originView.frame.size.height)
// self.sideBarContainerView.backgroundColor = UIColor(red: 0.4, green: 0.5, blue: 0.15, alpha: 1.0).colorWithAlphaComponent(0.1)
self.sideBarContainerView.backgroundColor = UIColor(red: 0.0, green: 0.47, blue: 0.53, alpha: 1.0)
// self.sideBarContainerView.backgroundColor = UIColor.clearColor()
self.sideBarContainerView.clipsToBounds = false
self.originView.addSubview(self.sideBarContainerView)
let blurView:UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
blurView.frame = self.sideBarContainerView.bounds
// self.sideBarContainerView.addSubview(blurView)
self.sideBarViewController.delegate = self
self.sideBarViewController.tableView.frame = self.sideBarContainerView.bounds
self.sideBarViewController.tableView.clipsToBounds = false
self.sideBarViewController.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
self.sideBarViewController.tableView.backgroundColor = UIColor.clearColor()
self.sideBarViewController.tableView.scrollsToTop = false
self.sideBarViewController.tableView.alwaysBounceVertical = false
self.sideBarViewController.tableView.contentInset = UIEdgeInsetsMake(self.sideBarTableViewInset, 0, 0, 0)
self.sideBarViewController.tableView.reloadData()
self.sideBarContainerView.addSubview(self.sideBarViewController.tableView)
}
func handleSwipe(gestureRecognizer: UISwipeGestureRecognizer) {
if gestureRecognizer.direction == UISwipeGestureRecognizerDirection.Right {
show(true)
self.delegate?.menuWillOpen?()
}
else {
show(false)
self.delegate?.menuWillClose?()
if let lastIndexPath = self.sideBarViewController.lastSelectedCellIndexPath {
self.sideBarViewController.tableView.deselectRowAtIndexPath(self.sideBarViewController.lastSelectedCellIndexPath!, animated: false)
}
}
}
func show(shouldOpen: Bool) {
self.animator.removeAllBehaviors()
self.isOpen = shouldOpen
let gravityX:CGFloat = shouldOpen ? 0.8 : -0.8
let magnitude:CGFloat = shouldOpen ? 40: -40
let boundaryX:CGFloat = shouldOpen ? barWidth : -barWidth - 1
let gravityBehaviour = UIGravityBehavior(items: [self.sideBarContainerView])
gravityBehaviour.gravityDirection = CGVectorMake(gravityX, 0)
self.animator.addBehavior(gravityBehaviour)
let collisionBehaviour = UICollisionBehavior(items: [self.sideBarContainerView])
collisionBehaviour.addBoundaryWithIdentifier("sideBarBoundary", fromPoint: CGPointMake(boundaryX, 20), toPoint: CGPointMake(boundaryX, originView.frame.size.height))
self.animator.addBehavior(collisionBehaviour)
let pushBehaviour = UIPushBehavior(items: [self.sideBarContainerView], mode: UIPushBehaviorMode.Instantaneous)
pushBehaviour.magnitude = magnitude
self.animator.addBehavior(pushBehaviour)
let dynamicItem = UIDynamicItemBehavior(items: [self.sideBarContainerView])
dynamicItem.elasticity = 0.3
self.animator.addBehavior(dynamicItem)
}
func didSelectItem(indexPath: NSIndexPath) {
self.delegate?.didSelectItemAtIndex(indexPath.row)
}
}