Compare commits

...

119 Commits

Author SHA1 Message Date
Anton d48909d9c4 Remove excess method 2015-10-30 03:45:46 +03:00
Anton 71eb343abe Slide menu open/close animation depends on currently opening part 2015-10-29 23:55:01 +03:00
Anton 95f692c225 Slide menu notifications extends params added 2015-10-23 17:19:45 +03:00
Nikolai Ashanin 42e62a4dbd Update SlideNavigationController.m
remove reverse when menu did end close
2015-10-07 18:30:01 +03:00
Nikolai Ashanin 2ed9400c82 Update SlideNavigationController.m
slide menu open/close different durations
2015-10-07 18:08:40 +03:00
Anton 06deaf308c View controller is opening when menu is starting to close 2015-10-06 14:21:09 +03:00
Anton f3b60362da Add duration on opening and closing animations
Some refactoring
2015-08-28 17:38:25 +03:00
Anton 9550d4719b Slide menu show new controller after menu closing 2015-08-27 17:11:42 +03:00
Anton d088879c28 Remove tap gesture recognizer disabling on viewWllLayoutSubview event 2015-07-30 19:26:21 +03:00
iON1k 5ef5a8d832 Merge pull request #1 from TouchInstinct/feature/swipeMenuBeginEvent
Feature/swipe menu begin event
2015-07-01 16:18:29 +03:00
Павел Круглов 0da57dfd53 Fixed orientation issues. 2015-07-01 15:58:20 +03:00
Павел Круглов 240684c788 Hook point for swipe menu begin. 2015-06-30 18:18:37 +03:00
Павел Круглов c6c729bb52 Merge commit '7fb3ec03e919a6d4a5c622f224c2277ace85c61f' into feature/swipeMenuBeginEvent 2015-06-30 18:10:29 +03:00
Aryan Ghassemi 7fb3ec03e9 Fixed is landscape issues #138 2015-04-22 20:25:52 -07:00
Aryan Ghassemi a9ca4b49b0 Update README.md 2015-04-20 14:48:26 -07:00
Aryan Ghassemi 363306a5c7 Merge pull request #127 from aryaxt/FixInterfaceOrientationWarning
Fixed interfaceOrientation deprecated warning
2015-04-11 10:51:47 -07:00
Aryan Ghassemi 4ce138d4e9 Update pod spec for version 1.4.6 2015-04-11 10:49:22 -07:00
Aryan Ghassemi 43cb763d79 Fixed interfaceOrientation deprecated warning 2015-04-11 10:43:38 -07:00
Aryan Ghassemi 8681050dd0 Update README.md 2015-03-11 21:48:41 -07:00
Aryan Ghassemi 98591515e6 Merge pull request #128 from aryaxt/Develop
Turning shouldRecognizeSimultaneouslyWithGestureRecognizer off
2015-03-11 21:34:46 -07:00
Aryan Ghassemi 1a1b8523ec Turning shouldRecognizeSimultaneouslyWithGestureRecognizer off it's causing many issues 2015-03-11 21:32:56 -07:00
Aryan Ghassemi 3c1b09fe74 Updated pod spec for version 1.4.5 2015-03-01 19:18:26 -08:00
Aryan Ghassemi 6a9333e81b Merge pull request #113 from aryaxt/Develop
Version 1.4.5
2015-03-01 19:15:53 -08:00
Aryan Ghassemi 07e14208be Merge pull request #120 from loevborg/master
Small change to pod-spec
2015-03-01 19:14:48 -08:00
loevborg 22c03d987e Removed local representation of pod spec 2015-02-17 14:24:45 +01:00
loevborg 0e1ac70eeb Changes to pod spec
Removed the source/assets-png’s from s.source_files, since this causes
warnings when compiling the pod in project.
The source/assets is correctly part of the pod spec: s.resources, and
this is the only place it should appear
2015-02-17 14:22:39 +01:00
Aryan Ghassemi 2cf2b31c62 Merge pull request #114 from pnicholls/master
Added call to super in SlideNavigationController's viewWillTransitionToSize method
2015-02-16 10:28:38 -08:00
Peter Nicholls f9909b669f add a missing call to super in the SlideNavigationController viewWillTransitionToSize method 2015-01-31 15:58:06 +11:00
Aryan Ghassemi 792fb82d6b Update README.md 2015-01-25 08:58:18 -08:00
Aryan eb2de83daf #79 and #90 Allow simultaneous gestures to be detected by the menu 2015-01-25 08:50:52 -08:00
Aryan 2786733c82 Code formatting 2015-01-25 08:49:13 -08:00
Aryan 9d38ca4c76 Fixed #103 add initWithNavigationBarClass to slide menu 2015-01-25 08:48:54 -08:00
Aryan Ghassemi c2638e8935 Merge pull request #102 from masterrr/master
fix typo
2014-12-14 12:14:49 -08:00
masterrr 907eee38e8 fix typo 2014-12-11 21:06:20 +03:00
Aryan 4c66f6c25c Allow configuring animation duration/option 2014-11-28 16:19:34 -08:00
Aryan Ghassemi 810457bb73 Merge pull request #97 from aryaxt/Develop
Version 1.4.4
2014-11-28 14:18:00 -08:00
Aryan 43f62e7321 removed border from menus in the demo 2014-11-28 14:12:13 -08:00
Aryan 7dba83b832 Changed podspec version to 1.4.4 2014-11-28 14:03:58 -08:00
Aryan 352a127909 Fixed #89. Slide menu initially appears on the wrong side when using slide animation 2014-11-28 12:26:21 -08:00
Aryan f2d50da1f6 Fixed #93. Make sure that when the menu is changed the old view is removed 2014-11-28 12:24:45 -08:00
Aryan cf05a15b2f A right bar button that is added in storyboard, and has nothing todo with slide functionality 2014-11-28 12:23:23 -08:00
Aryan Ghassemi 5aa1fbcd94 Merge pull request #75 from aryaxt/iOS8-Compatability
iOS 8 fixes including bug #66
2014-10-01 09:11:50 -07:00
Aryan ffa26fba5b iOS 8 fixes including bug #66 2014-10-01 08:57:45 -07:00
Aryan Ghassemi 81378731d9 Merge pull request #73 from aryaxt/Develop
Posting Notifications for menu state open/close/reveal
2014-09-06 13:46:34 -07:00
Aryan eca136202c Added Notifications for closing/opening/revealing menu #32 2014-09-06 13:39:48 -07:00
Aryan 3513ce023a Updating project settings 2014-09-06 12:57:26 -07:00
Aryan Ghassemi da97baea8c Update README.md 2014-09-06 12:10:45 -07:00
Aryan Ghassemi 5cf9218a78 Update README.md 2014-08-01 09:57:54 -07:00
Aryan Ghassemi f36d092d32 Update README.md 2014-08-01 09:54:35 -07:00
Aryan 705b9b9371 Updated pod file 2014-07-12 20:23:23 -07:00
Aryan Ghassemi 437270ae30 Fixed issue where sometimes when swiping really quick it's possible to see the wrong menu 2014-06-21 17:58:57 -07:00
Aryan Ghassemi 2a6be6a9fb Merge branch 'master' of https://github.com/aryaxt/iOS-Slide-Menu
* 'master' of https://github.com/aryaxt/iOS-Slide-Menu:
  Update README.md
2014-04-30 04:31:47 -07:00
Aryan Ghassemi 9e28dcbfb8 Update README.md 2014-04-30 04:31:04 -07:00
Aryan Ghassemi 1c341f78e0 Update README.md 2014-04-29 21:25:33 -07:00
Aryan Ghassemi 7a6dcf2d9d Created a demo to demonstrate different features of SlideNavigationController 2014-04-29 20:58:01 -07:00
Aryan Ghassemi 136b1aecf0 Fixed typo in setter method of "enableShadow" 2014-04-20 17:55:46 -07:00
Aryan Ghassemi 19f01241d8 Allow limiting the pan gesture to the sides of the view only. This would be helpful if you want to use the slide-delete functionality of the UITableView and have slide-menu-pan-gesture at the same time 2014-04-20 09:47:49 -07:00
Aryan Ghassemi 3aff93e08e Throwing an exception when more than 1 instance of SlideNavigationController is being initialized. Can't use dispatch once since SlideNavigationController van be initialized using different constructors 2014-04-20 09:16:59 -07:00
Aryan Ghassemi fd9a508323 - Added option to enable/disable shadow 2014-04-19 14:08:55 -07:00
Aryan Ghassemi 38f6bb528c Added new methods used for switching between ViewControllers and deprecated switchToViewController:withCompletion:. These new methods have more meaningfull names and decribe exactly what happends during a switch. You can also disable slide out animation using these new methods 2014-04-19 13:44:21 -07:00
Aryan Ghassemi d1281e7361 Bug #30 - Turn off interactivePopGestureRecognizer when the slide menu is open. 2014-04-19 09:49:09 -07:00
Aryan Ghassemi 8095b8c58c - Fixed duplicate viewControllers in storyboard in demo 2014-03-14 19:56:43 -07:00
Aryan Ghassemi d72c99be3c Update README.md 2014-02-07 13:10:14 -08:00
Aryan Ghassemi 8939751726 Update README.md 2014-02-07 13:09:21 -08:00
Aryan Ghassemi 439a6d76aa - Added bounce functionality (Let's say the right menu is for notifications, when you receive notification you bounce the right menu to let the user know that they should open the right menu to view the notification) 2014-02-07 13:07:26 -08:00
Aryan Ghassemi 220512c37f - Reusing logic to enable/disable tap
- Moved this logic to the correct methods (accidentally added to willLayoutSubviews instead of willRotateToInterfaceOrientation)
2014-02-02 12:23:30 -08:00
Aryan Ghassemi a718c6a097 - Fixing glitch, by removing tapGestureRecognizer during rotation 2014-02-02 12:13:10 -08:00
Aryan Ghassemi 25e35c5742 - Simplify code
- Make sure that user interaction is enable again after device rotates (while menu is open)
2014-02-02 12:05:37 -08:00
Aryan Ghassemi af932304ad Merge pull request #17 from nullproduction/master
Blocking gestures in minimized topViewController
- Gonna make some change to fix the glitch that happens when menu is open and device rotates
2014-02-02 12:00:45 -08:00
nullproduction e04b5f806a Blocking gestures in minimized topViewController 2014-01-31 15:34:15 +04:00
Aryan Ghassemi af6e1c33d5 - Adding missing resources to podspec 2014-01-27 22:23:47 -08:00
Aryan Ghassemi 59cc5c3c7c - Fixed podspec file 2014-01-27 22:07:50 -08:00
Aryan Ghassemi 6c12a07f58 - Updated pod spec file 2014-01-27 21:53:22 -08:00
Aryan Ghassemi c300cd5a34 - Added license to all new files 2014-01-27 21:39:24 -08:00
Aryan Ghassemi 15619fd4c7 - Updating menu frame and transformation when preparing to reveal, to ensure that even when the app launches in landscape mode the rotation is handled as soon as the menu is about to reveal 2014-01-27 21:33:20 -08:00
Aryan Ghassemi 31351393eb - Fixed an animation glitch in scale animation 2014-01-27 21:30:36 -08:00
Aryan Ghassemi 8d331af74e Merge remote-tracking branch 'origin/custom_animation'
* origin/custom_animation:
  - Cleanup - Fixed typo in property name renamed “leftbarButtonItem” to “leftBarButtonItem”
  - Fixed a bug where menu animation does not get completed when switching to another view controller because that viewController is not presenting the menu (delegate return NO or not implemented)
  - Some cleanup - Structured menu for a better presentation of slide menu features
  - Implemented clear for slide animation - Fixed an issue with scale animation
  - Separated all reveal animations from SlideNavigationController - Allowing a custom animation to be passed to slide menu and used for menu reveal animation
  - Added scale animation
2014-01-27 20:18:21 -08:00
Aryan Ghassemi 2b3be430f3 - Cleanup
- Fixed typo in property name renamed “leftbarButtonItem” to “leftBarButtonItem”
2014-01-27 20:17:32 -08:00
Aryan Ghassemi 8979fde62f Update README.md 2014-01-27 08:24:31 -08:00
Aryan Ghassemi f789c52e33 Update README.md 2014-01-26 20:17:37 -08:00
Aryan Ghassemi 66f18ce28d Update README.md 2014-01-26 20:16:12 -08:00
Aryan Ghassemi 024169558f Update README.md 2014-01-26 20:06:53 -08:00
Aryan Ghassemi 835e8bedd1 - Fixed a bug where menu animation does not get completed when switching to another view controller because that viewController is not presenting the menu (delegate return NO or not implemented) 2014-01-26 15:47:01 -08:00
Aryan Ghassemi f1025d7792 - Some cleanup
- Structured menu for a better presentation of slide menu features
2014-01-26 15:27:57 -08:00
Aryan Ghassemi 93b7afcfd8 - Implemented clear for slide animation
- Fixed an issue with scale animation
2014-01-26 15:05:21 -08:00
Aryan Ghassemi a759310b3b - Separated all reveal animations from SlideNavigationController
- Allowing a custom animation to be passed to slide menu and used for menu reveal animation
2014-01-26 14:47:32 -08:00
Aryan Ghassemi 373be13080 - Added scale animation 2014-01-26 12:28:45 -08:00
Aryan Ghassemi 7fa9e10b3e Fixed glitch where quick swipe in opposite directions may cause the menu not to appear 2014-01-22 15:55:54 -08:00
Aryan Ghassemi d7ad0e1a34 - Fixed menu rotation issue when app launches in landscape mode 2014-01-22 07:16:44 -08:00
Aryan Ghassemi 17c29fcdfa - Making the methods for opening and closing menu public
- Added 2 new public methods to toggle left and right menu, to be used for customization (Passing a custom UIBArButtonItem with a UIButton as custom view)
- Added a public method to determine whether the menu is open or not
- Fixed the issue where on iOS6  landscape mode the menu would go below the status bar
- Fixed the problem fade animation was applying alpha to the menu instead of fadeView
- Added all content to iPad story board for demo
2014-01-21 21:09:52 -08:00
Aryan Ghassemi 534113d0b7 Update README.md 2014-01-07 13:30:08 -08:00
Aryan Ghassemi f4c204c299 - Adding an animated gif to be used by the read me file 2014-01-07 13:27:52 -08:00
Aryan Ghassemi 2f58fb623e Update README.md 2014-01-07 13:17:55 -08:00
Aryan Ghassemi 66d17489ba - Fixed animation glitch that happens when menu is opened for the first time 2014-01-07 08:50:12 -08:00
Aryan Ghassemi ccd27bff8f - Removed accidentally checked in test-code 2014-01-06 22:15:29 -08:00
Aryan Ghassemi b22ee4dbae Merge remote-tracking branch 'origin/Menu_Reveal_Animation'
* origin/Menu_Reveal_Animation:
  - Added ability to display animations (Slide/Fade) when revealing the menu
2014-01-06 22:07:09 -08:00
Aryan Ghassemi 1aff5d7230 Update README.md 2014-01-06 22:01:33 -08:00
Aryan Ghassemi bbdad1962a - Added ability to display animations (Slide/Fade) when revealing the menu 2014-01-06 21:52:27 -08:00
Aryan Ghassemi 6de900f6fb Update README.md 2014-01-06 16:13:54 -08:00
Aryan Ghassemi 6401379cd6 - Fixed calculation for defining the middle of slide to decide whether slide menu should go left or right when touch is released 2014-01-06 08:03:50 -08:00
Aryan Ghassemi fc827a9fd8 - Faster quick swipe animation
- And more sensitivity for detecting quick swipe
2014-01-05 15:39:58 -08:00
Aryan Ghassemi 3554c28b2f - Fixed more animation glitches
- Fixed a bug where a fast swipe could present the menu even if delegate return NO
2014-01-05 15:34:30 -08:00
Aryan Ghassemi 812f9b5838 - Resizing shadow when viewVillLayout (fix for landscape right menu missing the shadow) 2014-01-05 15:21:32 -08:00
Aryan Ghassemi f32edb7041 - Code cleanup
- Simplified logic by avoiding orientation check in multiple placers
- Fix ome animation glitches
2014-01-05 15:18:41 -08:00
Aryan Ghassemi df4fa9ec41 - Forgot to include m file in previous commit 2014-01-05 14:41:57 -08:00
Aryan Ghassemi 48fc91164a - Fix typo in property for rightMenu (renamed from righMenu to rightMenu)
- Avoid the weird background animation of the shadow when rotating device
2014-01-05 14:41:35 -08:00
Aryan Ghassemi 1b5b643ef3 - Allowing the slide offset to be set on portrait and landscape mode 2014-01-05 10:18:22 -08:00
Aryan Ghassemi e5790197a3 - Overriding layoutSubviews and resizing left and right menus accordingly 2014-01-05 10:07:46 -08:00
Aryan Ghassemi 819f691982 - Initial commit for landscape mode
- Need to resize/relocate menus properly
2014-01-05 09:36:15 -08:00
Aryan Ghassemi 5a762de1e1 Update README.md 2014-01-03 13:24:48 -08:00
Aryan Ghassemi fab2359f11 Update README.md 2014-01-03 13:24:29 -08:00
Aryan Ghassemi a1005968a4 - Resized screen shot 2014-01-03 13:23:45 -08:00
Aryan Ghassemi 06effba751 - Added a screen shot 2014-01-03 13:20:57 -08:00
Aryan Ghassemi 1350104883 - Fixed warnings 2013-12-31 10:51:22 -08:00
Aryan Ghassemi 751c850515 - Added missing file 2013-12-31 09:31:55 -08:00
Aryan Ghassemi 3f9cbe0e00 - Better sample to demonstrate use of SlideNavigationController 2013-12-31 09:23:35 -08:00
Aryan Ghassemi 89be41d382 - Updated pod spec 2013-12-24 09:08:24 -08:00
Aryan Ghassemi 43022c5638 - Updated pod spec 2013-12-24 08:16:21 -08:00
Aryan Ghassemi 62e737bd83 Fixed #5
Quick swipe should not open menu if delegate is not implemented or returns NO
2013-10-27 16:26:23 -07:00
43 changed files with 2928 additions and 434 deletions

168
README.md
View File

@ -1,14 +1,31 @@
iOS-Slide-Menu iOS-Slide-Menu
============== ---------
iOS Slide Menu built on top of UINavigationController, with configurable buttons, reveal animations, and tap/swiper gesture recognizers.
iOS Slide Menu built on top of UINavigationController. - [Setup](https://github.com/aryaxt/iOS-Slide-Menu#setup)
- [Enable/Disable Left/Right Menu](https://github.com/aryaxt/iOS-Slide-Menu#configuring-left-and-right-menu-for-different-viewcontrollers)
- [Public Properties](https://github.com/aryaxt/iOS-Slide-Menu#public-properties)
- [Public Methods](https://github.com/aryaxt/iOS-Slide-Menu#public-methods)
- [Custom Animations](https://github.com/aryaxt/iOS-Slide-Menu#custom-animations)
- [Notifications](https://github.com/aryaxt/iOS-Slide-Menu#notifications)
Features: ![alt tag](https://raw.github.com/aryaxt/iOS-Slide-Menu/master/slideMenuAnimation.gif)
- Righ Menu
- Left Menu Version 1.4.0 Notes
- Configurable Buttons ---------
- Allows Enable/Disable menu by implmenting delegate methods ```switchToViewController:withCompletion:``` method has been deprecated. In order to get the exact same behavior use ```popToRootAndSwitchToViewController:withCompletion```
- Tap/Swipe gesture recognizer to Open/Close the Menus
New features:
- Allows limiting pan gesture to the sides of the view
- Allows turning shadow on/off
- Allows turning slide-out animation on/off when switching between viewControllers
- Minor bug fixes
Version 1.3.0 Notes
---------
If you are updating from previous versions you'll get compile errors, due to changes to RevealAnimations.
Animation configuration is now handled differently, and is separated from the SlideNavigationController.
Please see bwlow for more information.
Setup Setup
--------- ---------
@ -16,24 +33,18 @@ Setup
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ {
LeftMenuViewController *leftMenu = [[LeftMenuViewController alloc] init]; LeftMenuViewController *leftMenu = [[LeftMenuViewController alloc] init];
RightMenuViewController *righMenu = [[RightMenuViewController alloc] init]; RightMenuViewController *rightMenu = [[RightMenuViewController alloc] init];
[SlideNavigationController sharedInstance].righMenu = rightMenu; [SlideNavigationController sharedInstance].rightMenu = rightMenu;
[SlideNavigationController sharedInstance].leftMenu = leftMenu; [SlideNavigationController sharedInstance].leftMenu = leftMenu;
// Override point for customization after application launch. // Override point for customization after application launch.
return YES; return YES;
} }
``` ```
Switch Between ViewControllers
----------
Let's say a menu item was selected
```
SomeViewController *vc = [[SomeViewController alloc] init];
[[SlideNavigationController sharedInstance] switchToViewController:vc withCompletion:nil];
```
Configuring Left and Right menu for different Viewcontrollers Configuring Left and Right menu for different Viewcontrollers
--------- ---------
You decide whether to enable or disable slide functionality on **each viewController** by implementing the following delegate methods of SlideNavigationControllerDelegate. These methods are optional, and if not implemented the menu functionality will be disabled for that particulat viewController.
``` ```
@interface MyViewController : UIViewController <SlideNavigationControllerDelegate> @interface MyViewController : UIViewController <SlideNavigationControllerDelegate>
@end @end
@ -53,3 +64,126 @@ Configuring Left and Right menu for different Viewcontrollers
@end @end
``` ```
Public properties
---------
###### avoidSwitchingToSameClassViewController
Default value is set to YES.
If set to YES when switching to a new ViewController if the new viewcontroller is the same type as the current viewcontroller it'll close the menu instead of switching to the viewController.
If set to NO it'll switch to the viewController regardless of types
This can be usefull when you have a menu item, and when the user selects an already selected menu item you don't want to navigate to a new instance of the viewController
###### enableSwipeGesture
When set to YES user can swipe to open the menu
When set to NO swipe is disabled, and use can only open the menu using the UIBarButtonItem added to the navigationBar
######panGestureSideOffset
This property allows you to limit the gesture to the sides of the view. For instance setting this value to 50 means touches are limited to 50 pixels to the right and 50 pixels to the left of the view. This could be useful if you are expecting slide-to-delete functionality on UITableViews.
Default value of panGestureSideOffset is set to 0. Setting panGestureSideOffset to 0 means touches are detected in the whole view if enableSwipeGesture is set to true.
###### enableShadow
A boolean that allows you to turn shadow on/off. On default shadow is set to true
###### rightMenu
The viewController of the right menu in the navigationController
###### leftMenu
The viewController of the left menu in the navigationController
###### leftBarButtonItem
Default value is null. When this button is set navigationController uses this UIBarButtonItem as the leftItem. this property is intended to be used when a custom UIBarButton is needed (UIBarButtonItem initialized with a custom view)
###### rightBarButtonItem
Behaves exactly the same as leftbarButtonItem, but it's used as the right button for the menu
###### portraitSlideOffset
Default value of portraitSlideOffset is 60. This means when the menu is open, the width of the visible portion of the navigation controller is 60 pixels in portrait mode
###### landscapeSlideOffset
Default value of portraitSlideOffset is 60. This means when the menu is open, the width of the visible portion of the navigation controller is 60 pixels in landscape mode
###### menuRevealAnimationDuration
Default value of animation duration is .3, this property allows configuring animation duration
###### menuRevealAnimationOption
Defaults to UIViewAnimationOptionCurveEaseOut, you can change this property to configure animation options
###### menuRevealAnimator
menuRevealAnimator is used to animate the left/right menu during reveal. The default value is nil, that means no animations occure when opening/closing the menu.
There are existing animation classes that can be used. These animation classes can be configured through init method options.
- SlideNavigationContorllerAnimatorSlide
- SlideNavigationContorllerAnimatorFade
- SlideNavigationContorllerAnimatorScale
- SlideNavigationContorllerAnimatorScaleAndFade
- SlideNavigationContorllerAnimatorSlideAndFade
```
SlideNavigationContorllerAnimatorSlideAndFade *alideAndFadeAnimator = [[SlideNavigationContorllerAnimatorSlideAndFade alloc] initWithMaximumFadeAlpha:.8 fadeColor:[UIColor redColor] andSlideMovement:100];
[SlideNavigationController sharedInstance].menuRevealAnimator = alideAndFadeAnimator;
```
Public Methods
---------
###### + (SlideNavigationController *)sharedInstance;
Returns the singleton instance of SlideNavigationController
###### - (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion;
This method is deprecated
###### - (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion;
Pops to root view controller and calls the completion.
###### - (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion;
Similar to previous method, but allows turning on/off slide-out-animation during the switch
###### - (void)popAllAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion;
Replaces the ViewController stack with a new stack that includes the new ViewController, and calls completion
###### - (void)popAllAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion;
Similar to previous method, but allows turning on/off slide-out-animation during the switch
###### - (void)openMenu:(Menu)menu withCompletion:(void (^)())completion;
Opens a given menu and calls the completion block oppon animation completion
###### - (void)closeMenuWithCompletion:(void (^)())completion;
Closes the menu and calls the completion block oppon animation completion
###### - (void)toggleLeftMenu;
Toggles the left menu open or close depending on the existing state. This was made public in order to pass the selector to a custom UIBarButtonItem (ex: UIBarButtonItem with a button as a custom view)
```
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[button setImage:[UIImage imageNamed:@"menu-button"] forState:UIControlStateNormal];
[button addTarget:[SlideNavigationController sharedInstance] action:@selector(toggleRightMenu) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
[SlideNavigationController sharedInstance].rightBarButtonItem = rightBarButtonItem;
```
###### - (void)bounceMenu:(Menu)menu withCompletion:(void (^)())completion;
Bounces either right or left menu, and calls the completion block oppon animation completion
###### - (void)toggleRightMenu;
Works exactly the same as toggleLeftMenu, but used to toggle left menu
###### - (BOOL)isMenuOpen;
Returns a boolean stating whether the menu is open or not
Custom Animations
---------
SlideNavigationController allows custom reveal animations. In order to add custom animations create a new class implementing SlideNavigationContorllerAnimator protocol. For more information take a look at the existing animation classes.
###### - (void)prepareMenuForAnimation:(Menu)menu;
This method gets called right before the menu is about to reveal
###### - (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress;
This method gets called as the menu reveal occurs, and passes the progress to be used for animations(progress is between 0 and 1)
###### - (void)clear;
This method gets called if for any resons the instance of animator is being changed. For instance, the animator is changed from SlideNavigationContorllerAnimatorFade to SlideNavigationContorllerAnimatorSlide. In this method you should cleanup the state of the menu if neede. For instance if you added a view to the menu for reveal animation, you should remove it when clear gets called.
Public Methods
Notifications
---------
###### SlideNavigationControllerDidOpen
This notification is posted EVERY time the menu goes inot a complete open state
Userinfo contains a value with key "menu", which could have 2 values "left" and "right"
###### SlideNavigationControllerDidClose
This notification is posted EVERY time the menu goes inot a complete close state
Userinfo contains a value with key "menu", which could have 2 values "left" and "right"
###### SlideNavigationControllerDidReveal
This notification is posted once everytim a menu reveals
Userinfo contains a value with key "menu", which could have 2 values "left" and "right"

110
SlideMenu.xcodeproj/project.pbxproj Normal file → Executable file
View File

@ -18,19 +18,29 @@
15371EF91728E3B400A508F4 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15371EF81728E3B400A508F4 /* Default-568h@2x.png */; }; 15371EF91728E3B400A508F4 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15371EF81728E3B400A508F4 /* Default-568h@2x.png */; };
15371EFC1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 15371EFA1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard */; }; 15371EFC1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 15371EFA1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard */; };
15371EFF1728E3B400A508F4 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 15371EFD1728E3B400A508F4 /* MainStoryboard_iPad.storyboard */; }; 15371EFF1728E3B400A508F4 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 15371EFD1728E3B400A508F4 /* MainStoryboard_iPad.storyboard */; };
15371F0A1728E3B400A508F4 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15371F091728E3B400A508F4 /* SenTestingKit.framework */; };
15371F0B1728E3B400A508F4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15371EE21728E3B400A508F4 /* UIKit.framework */; }; 15371F0B1728E3B400A508F4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15371EE21728E3B400A508F4 /* UIKit.framework */; };
15371F0C1728E3B400A508F4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15371EE41728E3B400A508F4 /* Foundation.framework */; }; 15371F0C1728E3B400A508F4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15371EE41728E3B400A508F4 /* Foundation.framework */; };
15371F141728E3B400A508F4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 15371F121728E3B400A508F4 /* InfoPlist.strings */; }; 15371F141728E3B400A508F4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 15371F121728E3B400A508F4 /* InfoPlist.strings */; };
15371F171728E3B400A508F4 /* SlideMenuTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 15371F161728E3B400A508F4 /* SlideMenuTests.m */; }; 15371F171728E3B400A508F4 /* SlideMenuTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 15371F161728E3B400A508F4 /* SlideMenuTests.m */; };
15371F281728E44E00A508F4 /* SlideNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15371F271728E44E00A508F4 /* SlideNavigationController.m */; }; 15371F281728E44E00A508F4 /* SlideNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15371F271728E44E00A508F4 /* SlideNavigationController.m */; };
15C9AC111895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C9AC101895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.m */; };
15C9AC141895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C9AC131895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.m */; };
15C9AC171895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C9AC161895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.m */; };
15C9AC1A1895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C9AC191895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.m */; };
15C9AC1D1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 15C9AC1C1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.m */; };
15CBD67C172A15F900F0C53E /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD677172A15F900F0C53E /* HomeViewController.m */; }; 15CBD67C172A15F900F0C53E /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD677172A15F900F0C53E /* HomeViewController.m */; };
15CBD67D172A15F900F0C53E /* MenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD679172A15F900F0C53E /* MenuViewController.m */; }; 15CBD67D172A15F900F0C53E /* LeftMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD679172A15F900F0C53E /* LeftMenuViewController.m */; };
15CBD67E172A15F900F0C53E /* ProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD67B172A15F900F0C53E /* ProfileViewController.m */; }; 15CBD67E172A15F900F0C53E /* ProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD67B172A15F900F0C53E /* ProfileViewController.m */; };
15CBD689172A22B700F0C53E /* ProfileDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD688172A22B700F0C53E /* ProfileDetailViewController.m */; }; 15CBD689172A22B700F0C53E /* ProfileDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15CBD688172A22B700F0C53E /* ProfileDetailViewController.m */; };
15CBD699172A57F100F0C53E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CBD698172A57F100F0C53E /* QuartzCore.framework */; }; 15CBD699172A57F100F0C53E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15CBD698172A57F100F0C53E /* QuartzCore.framework */; };
15CBD6BE172BBB3600F0C53E /* menu-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CBD6BD172BBB3600F0C53E /* menu-button@2x.png */; }; 15CBD6BE172BBB3600F0C53E /* menu-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CBD6BD172BBB3600F0C53E /* menu-button@2x.png */; };
15CBD6C0172BBB7100F0C53E /* menu-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CBD6BF172BBB7100F0C53E /* menu-button.png */; }; 15CBD6C0172BBB7100F0C53E /* menu-button.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CBD6BF172BBB7100F0C53E /* menu-button.png */; };
15E7D318190C24E3002EAE3F /* RightMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15E7D317190C24E3002EAE3F /* RightMenuViewController.m */; };
15E7D31B190C289E002EAE3F /* animation.png in Resources */ = {isa = PBXBuildFile; fileRef = 15E7D31A190C289E002EAE3F /* animation.png */; };
15E7D31F190C33A5002EAE3F /* leftMenu.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 15E7D31D190C33A5002EAE3F /* leftMenu.jpg */; };
15E7D321190C3B75002EAE3F /* rightMenu.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 15E7D320190C3B75002EAE3F /* rightMenu.jpg */; };
15E7D327190C3DAE002EAE3F /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = 15E7D326190C3DAE002EAE3F /* gear.png */; };
997929E2187336AA00716C77 /* FriendsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 997929E1187336AA00716C77 /* FriendsViewController.m */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -59,18 +69,28 @@
15371EF81728E3B400A508F4 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; }; 15371EF81728E3B400A508F4 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
15371EFB1728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; }; 15371EFB1728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
15371EFE1728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; }; 15371EFE1728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
15371F081728E3B400A508F4 /* SlideMenuTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SlideMenuTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; 15371F081728E3B400A508F4 /* SlideMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SlideMenuTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
15371F091728E3B400A508F4 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
15371F111728E3B400A508F4 /* SlideMenuTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SlideMenuTests-Info.plist"; sourceTree = "<group>"; }; 15371F111728E3B400A508F4 /* SlideMenuTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SlideMenuTests-Info.plist"; sourceTree = "<group>"; };
15371F131728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 15371F131728E3B400A508F4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
15371F151728E3B400A508F4 /* SlideMenuTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlideMenuTests.h; sourceTree = "<group>"; }; 15371F151728E3B400A508F4 /* SlideMenuTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlideMenuTests.h; sourceTree = "<group>"; };
15371F161728E3B400A508F4 /* SlideMenuTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlideMenuTests.m; sourceTree = "<group>"; }; 15371F161728E3B400A508F4 /* SlideMenuTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlideMenuTests.m; sourceTree = "<group>"; };
15371F261728E44E00A508F4 /* SlideNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationController.h; sourceTree = "<group>"; }; 15371F261728E44E00A508F4 /* SlideNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationController.h; sourceTree = "<group>"; };
15371F271728E44E00A508F4 /* SlideNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationController.m; sourceTree = "<group>"; }; 15371F271728E44E00A508F4 /* SlideNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationController.m; sourceTree = "<group>"; };
15C9AC0F1895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimatorSlide.h; sourceTree = "<group>"; };
15C9AC101895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationContorllerAnimatorSlide.m; sourceTree = "<group>"; };
15C9AC121895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimatorFade.h; sourceTree = "<group>"; };
15C9AC131895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationContorllerAnimatorFade.m; sourceTree = "<group>"; };
15C9AC151895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimatorSlideAndFade.h; sourceTree = "<group>"; };
15C9AC161895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationContorllerAnimatorSlideAndFade.m; sourceTree = "<group>"; };
15C9AC181895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimatorScale.h; sourceTree = "<group>"; };
15C9AC191895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationContorllerAnimatorScale.m; sourceTree = "<group>"; };
15C9AC1B1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimatorScaleAndFade.h; sourceTree = "<group>"; };
15C9AC1C1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideNavigationContorllerAnimatorScaleAndFade.m; sourceTree = "<group>"; };
15C9AC1E1895A832006E6F27 /* SlideNavigationContorllerAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideNavigationContorllerAnimator.h; sourceTree = "<group>"; };
15CBD676172A15F900F0C53E /* HomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeViewController.h; sourceTree = "<group>"; }; 15CBD676172A15F900F0C53E /* HomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeViewController.h; sourceTree = "<group>"; };
15CBD677172A15F900F0C53E /* HomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeViewController.m; sourceTree = "<group>"; }; 15CBD677172A15F900F0C53E /* HomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeViewController.m; sourceTree = "<group>"; };
15CBD678172A15F900F0C53E /* MenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuViewController.h; sourceTree = "<group>"; }; 15CBD678172A15F900F0C53E /* LeftMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeftMenuViewController.h; sourceTree = "<group>"; };
15CBD679172A15F900F0C53E /* MenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuViewController.m; sourceTree = "<group>"; }; 15CBD679172A15F900F0C53E /* LeftMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LeftMenuViewController.m; sourceTree = "<group>"; };
15CBD67A172A15F900F0C53E /* ProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileViewController.h; sourceTree = "<group>"; }; 15CBD67A172A15F900F0C53E /* ProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileViewController.h; sourceTree = "<group>"; };
15CBD67B172A15F900F0C53E /* ProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProfileViewController.m; sourceTree = "<group>"; }; 15CBD67B172A15F900F0C53E /* ProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProfileViewController.m; sourceTree = "<group>"; };
15CBD687172A22B600F0C53E /* ProfileDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileDetailViewController.h; sourceTree = "<group>"; }; 15CBD687172A22B600F0C53E /* ProfileDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileDetailViewController.h; sourceTree = "<group>"; };
@ -78,6 +98,14 @@
15CBD698172A57F100F0C53E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 15CBD698172A57F100F0C53E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
15CBD6BD172BBB3600F0C53E /* menu-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu-button@2x.png"; sourceTree = "<group>"; }; 15CBD6BD172BBB3600F0C53E /* menu-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu-button@2x.png"; sourceTree = "<group>"; };
15CBD6BF172BBB7100F0C53E /* menu-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu-button.png"; sourceTree = "<group>"; }; 15CBD6BF172BBB7100F0C53E /* menu-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu-button.png"; sourceTree = "<group>"; };
15E7D316190C24E3002EAE3F /* RightMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RightMenuViewController.h; sourceTree = "<group>"; };
15E7D317190C24E3002EAE3F /* RightMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RightMenuViewController.m; sourceTree = "<group>"; };
15E7D31A190C289E002EAE3F /* animation.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = animation.png; sourceTree = "<group>"; };
15E7D31D190C33A5002EAE3F /* leftMenu.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = leftMenu.jpg; sourceTree = "<group>"; };
15E7D320190C3B75002EAE3F /* rightMenu.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rightMenu.jpg; sourceTree = "<group>"; };
15E7D326190C3DAE002EAE3F /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gear.png; sourceTree = "<group>"; };
997929E0187336AA00716C77 /* FriendsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FriendsViewController.h; sourceTree = "<group>"; };
997929E1187336AA00716C77 /* FriendsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FriendsViewController.m; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -96,7 +124,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
15371F0A1728E3B400A508F4 /* SenTestingKit.framework in Frameworks */,
15371F0B1728E3B400A508F4 /* UIKit.framework in Frameworks */, 15371F0B1728E3B400A508F4 /* UIKit.framework in Frameworks */,
15371F0C1728E3B400A508F4 /* Foundation.framework in Frameworks */, 15371F0C1728E3B400A508F4 /* Foundation.framework in Frameworks */,
); );
@ -119,7 +146,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
15371EDE1728E3B400A508F4 /* SlideMenu.app */, 15371EDE1728E3B400A508F4 /* SlideMenu.app */,
15371F081728E3B400A508F4 /* SlideMenuTests.octest */, 15371F081728E3B400A508F4 /* SlideMenuTests.xctest */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -131,7 +158,6 @@
15371EE21728E3B400A508F4 /* UIKit.framework */, 15371EE21728E3B400A508F4 /* UIKit.framework */,
15371EE41728E3B400A508F4 /* Foundation.framework */, 15371EE41728E3B400A508F4 /* Foundation.framework */,
15371EE61728E3B400A508F4 /* CoreGraphics.framework */, 15371EE61728E3B400A508F4 /* CoreGraphics.framework */,
15371F091728E3B400A508F4 /* SenTestingKit.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -139,6 +165,7 @@
15371EE81728E3B400A508F4 /* SlideMenu */ = { 15371EE81728E3B400A508F4 /* SlideMenu */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
15E7D319190C2894002EAE3F /* Images */,
15CBD675172A15F900F0C53E /* Helper Classes */, 15CBD675172A15F900F0C53E /* Helper Classes */,
15371F241728E43600A508F4 /* Source */, 15371F241728E43600A508F4 /* Source */,
15371EF11728E3B400A508F4 /* AppDelegate.h */, 15371EF11728E3B400A508F4 /* AppDelegate.h */,
@ -186,6 +213,7 @@
15371F241728E43600A508F4 /* Source */ = { 15371F241728E43600A508F4 /* Source */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
15C9AC0E1895A79A006E6F27 /* Animations */,
15CBD681172A209500F0C53E /* Assets */, 15CBD681172A209500F0C53E /* Assets */,
15371F261728E44E00A508F4 /* SlideNavigationController.h */, 15371F261728E44E00A508F4 /* SlideNavigationController.h */,
15371F271728E44E00A508F4 /* SlideNavigationController.m */, 15371F271728E44E00A508F4 /* SlideNavigationController.m */,
@ -193,13 +221,35 @@
path = Source; path = Source;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
15C9AC0E1895A79A006E6F27 /* Animations */ = {
isa = PBXGroup;
children = (
15C9AC0F1895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.h */,
15C9AC101895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.m */,
15C9AC121895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.h */,
15C9AC131895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.m */,
15C9AC151895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.h */,
15C9AC161895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.m */,
15C9AC181895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.h */,
15C9AC191895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.m */,
15C9AC1B1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.h */,
15C9AC1C1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.m */,
15C9AC1E1895A832006E6F27 /* SlideNavigationContorllerAnimator.h */,
);
path = Animations;
sourceTree = "<group>";
};
15CBD675172A15F900F0C53E /* Helper Classes */ = { 15CBD675172A15F900F0C53E /* Helper Classes */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
15CBD678172A15F900F0C53E /* LeftMenuViewController.h */,
15CBD679172A15F900F0C53E /* LeftMenuViewController.m */,
15E7D316190C24E3002EAE3F /* RightMenuViewController.h */,
15E7D317190C24E3002EAE3F /* RightMenuViewController.m */,
15CBD676172A15F900F0C53E /* HomeViewController.h */, 15CBD676172A15F900F0C53E /* HomeViewController.h */,
15CBD677172A15F900F0C53E /* HomeViewController.m */, 15CBD677172A15F900F0C53E /* HomeViewController.m */,
15CBD678172A15F900F0C53E /* MenuViewController.h */, 997929E0187336AA00716C77 /* FriendsViewController.h */,
15CBD679172A15F900F0C53E /* MenuViewController.m */, 997929E1187336AA00716C77 /* FriendsViewController.m */,
15CBD67A172A15F900F0C53E /* ProfileViewController.h */, 15CBD67A172A15F900F0C53E /* ProfileViewController.h */,
15CBD67B172A15F900F0C53E /* ProfileViewController.m */, 15CBD67B172A15F900F0C53E /* ProfileViewController.m */,
15CBD687172A22B600F0C53E /* ProfileDetailViewController.h */, 15CBD687172A22B600F0C53E /* ProfileDetailViewController.h */,
@ -217,6 +267,17 @@
path = Assets; path = Assets;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
15E7D319190C2894002EAE3F /* Images */ = {
isa = PBXGroup;
children = (
15E7D326190C3DAE002EAE3F /* gear.png */,
15E7D320190C3B75002EAE3F /* rightMenu.jpg */,
15E7D31D190C33A5002EAE3F /* leftMenu.jpg */,
15E7D31A190C289E002EAE3F /* animation.png */,
);
path = Images;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -253,8 +314,8 @@
); );
name = SlideMenuTests; name = SlideMenuTests;
productName = SlideMenuTests; productName = SlideMenuTests;
productReference = 15371F081728E3B400A508F4 /* SlideMenuTests.octest */; productReference = 15371F081728E3B400A508F4 /* SlideMenuTests.xctest */;
productType = "com.apple.product-type.bundle"; productType = "com.apple.product-type.bundle.unit-test";
}; };
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
@ -262,7 +323,8 @@
15371ED51728E3B400A508F4 /* Project object */ = { 15371ED51728E3B400A508F4 /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 0450; LastTestingUpgradeCheck = 0600;
LastUpgradeCheck = 0500;
ORGANIZATIONNAME = "Aryan Ghassemi"; ORGANIZATIONNAME = "Aryan Ghassemi";
}; };
buildConfigurationList = 15371ED81728E3B400A508F4 /* Build configuration list for PBXProject "SlideMenu" */; buildConfigurationList = 15371ED81728E3B400A508F4 /* Build configuration list for PBXProject "SlideMenu" */;
@ -289,9 +351,13 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
15371EED1728E3B400A508F4 /* InfoPlist.strings in Resources */, 15371EED1728E3B400A508F4 /* InfoPlist.strings in Resources */,
15E7D321190C3B75002EAE3F /* rightMenu.jpg in Resources */,
15E7D327190C3DAE002EAE3F /* gear.png in Resources */,
15371EF51728E3B400A508F4 /* Default.png in Resources */, 15371EF51728E3B400A508F4 /* Default.png in Resources */,
15371EF71728E3B400A508F4 /* Default@2x.png in Resources */, 15371EF71728E3B400A508F4 /* Default@2x.png in Resources */,
15E7D31F190C33A5002EAE3F /* leftMenu.jpg in Resources */,
15371EF91728E3B400A508F4 /* Default-568h@2x.png in Resources */, 15371EF91728E3B400A508F4 /* Default-568h@2x.png in Resources */,
15E7D31B190C289E002EAE3F /* animation.png in Resources */,
15371EFC1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard in Resources */, 15371EFC1728E3B400A508F4 /* MainStoryboard_iPhone.storyboard in Resources */,
15371EFF1728E3B400A508F4 /* MainStoryboard_iPad.storyboard in Resources */, 15371EFF1728E3B400A508F4 /* MainStoryboard_iPad.storyboard in Resources */,
15CBD6BE172BBB3600F0C53E /* menu-button@2x.png in Resources */, 15CBD6BE172BBB3600F0C53E /* menu-button@2x.png in Resources */,
@ -330,11 +396,18 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
15E7D318190C24E3002EAE3F /* RightMenuViewController.m in Sources */,
15C9AC1D1895A81D006E6F27 /* SlideNavigationContorllerAnimatorScaleAndFade.m in Sources */,
15C9AC171895A7E7006E6F27 /* SlideNavigationContorllerAnimatorSlideAndFade.m in Sources */,
15371EEF1728E3B400A508F4 /* main.m in Sources */, 15371EEF1728E3B400A508F4 /* main.m in Sources */,
15371EF31728E3B400A508F4 /* AppDelegate.m in Sources */, 15371EF31728E3B400A508F4 /* AppDelegate.m in Sources */,
15C9AC141895A7D7006E6F27 /* SlideNavigationContorllerAnimatorFade.m in Sources */,
15371F281728E44E00A508F4 /* SlideNavigationController.m in Sources */, 15371F281728E44E00A508F4 /* SlideNavigationController.m in Sources */,
15C9AC111895A7BF006E6F27 /* SlideNavigationContorllerAnimatorSlide.m in Sources */,
15CBD67C172A15F900F0C53E /* HomeViewController.m in Sources */, 15CBD67C172A15F900F0C53E /* HomeViewController.m in Sources */,
15CBD67D172A15F900F0C53E /* MenuViewController.m in Sources */, 997929E2187336AA00716C77 /* FriendsViewController.m in Sources */,
15CBD67D172A15F900F0C53E /* LeftMenuViewController.m in Sources */,
15C9AC1A1895A80E006E6F27 /* SlideNavigationContorllerAnimatorScale.m in Sources */,
15CBD67E172A15F900F0C53E /* ProfileViewController.m in Sources */, 15CBD67E172A15F900F0C53E /* ProfileViewController.m in Sources */,
15CBD689172A22B700F0C53E /* ProfileDetailViewController.m in Sources */, 15CBD689172A22B700F0C53E /* ProfileDetailViewController.m in Sources */,
); );
@ -417,6 +490,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 6.0; IPHONEOS_DEPLOYMENT_TARGET = 6.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
@ -451,6 +525,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch"; GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch";
INFOPLIST_FILE = "SlideMenu/SlideMenu-Info.plist"; INFOPLIST_FILE = "SlideMenu/SlideMenu-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@ -462,6 +537,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch"; GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch";
INFOPLIST_FILE = "SlideMenu/SlideMenu-Info.plist"; INFOPLIST_FILE = "SlideMenu/SlideMenu-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@ -474,13 +550,13 @@
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"\"$(SDKROOT)/Developer/Library/Frameworks\"", "\"$(SDKROOT)/Developer/Library/Frameworks\"",
"\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
"$(inherited)",
); );
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch"; GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch";
INFOPLIST_FILE = "SlideMenuTests/SlideMenuTests-Info.plist"; INFOPLIST_FILE = "SlideMenuTests/SlideMenuTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)"; TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = octest;
}; };
name = Debug; name = Debug;
}; };
@ -491,13 +567,13 @@
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"\"$(SDKROOT)/Developer/Library/Frameworks\"", "\"$(SDKROOT)/Developer/Library/Frameworks\"",
"\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
"$(inherited)",
); );
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch"; GCC_PREFIX_HEADER = "SlideMenu/SlideMenu-Prefix.pch";
INFOPLIST_FILE = "SlideMenuTests/SlideMenuTests-Info.plist"; INFOPLIST_FILE = "SlideMenuTests/SlideMenuTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)"; TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = octest;
}; };
name = Release; name = Release;
}; };

View File

@ -8,7 +8,8 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "SlideNavigationController.h" #import "SlideNavigationController.h"
#import "MenuViewController.h" #import "LeftMenuViewController.h"
#import "RightMenuViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate> @interface AppDelegate : UIResponder <UIApplicationDelegate>

View File

@ -15,18 +15,43 @@
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
bundle: nil]; bundle: nil];
MenuViewController *rightMenu = (MenuViewController*)[mainStoryboard LeftMenuViewController *leftMenu = (LeftMenuViewController*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"MenuViewController"]; instantiateViewControllerWithIdentifier: @"LeftMenuViewController"];
rightMenu.view.backgroundColor = [UIColor yellowColor];
rightMenu.cellIdentifier = @"rightMenuCell";
MenuViewController *leftMenu = (MenuViewController*)[mainStoryboard RightMenuViewController *rightMenu = (RightMenuViewController*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"MenuViewController"]; instantiateViewControllerWithIdentifier: @"RightMenuViewController"];
leftMenu.view.backgroundColor = [UIColor lightGrayColor];
leftMenu.cellIdentifier = @"leftMenuCell";
[SlideNavigationController sharedInstance].righMenu = rightMenu; [SlideNavigationController sharedInstance].rightMenu = rightMenu;
[SlideNavigationController sharedInstance].leftMenu = leftMenu; [SlideNavigationController sharedInstance].leftMenu = leftMenu;
[SlideNavigationController sharedInstance].menuRevealAnimationDuration = .18;
// Creating a custom bar button for right menu
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[button setImage:[UIImage imageNamed:@"gear"] forState:UIControlStateNormal];
[button addTarget:[SlideNavigationController sharedInstance] action:@selector(toggleRightMenu) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
[SlideNavigationController sharedInstance].rightBarButtonItem = rightBarButtonItem;
[[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidClose object:nil queue:nil usingBlock:^(NSNotification *note) {
NSString *menu = note.userInfo[@"menu"];
NSLog(@"Closed %@", menu);
}];
[[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidOpen object:nil queue:nil usingBlock:^(NSNotification *note) {
NSString *menu = note.userInfo[@"menu"];
NSLog(@"Opened %@", menu);
}];
[[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerWillOpen object:nil queue:nil usingBlock:^(NSNotification *note) {
NSString *menu = note.userInfo[@"menu"];
NSLog(@"Opening %@", menu);
}];
[[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidReveal object:nil queue:nil usingBlock:^(NSNotification *note) {
NSString *menu = note.userInfo[@"menu"];
NSLog(@"Revealed %@", menu);
}];
// Override point for customization after application launch. // Override point for customization after application launch.
return YES; return YES;

View File

@ -0,0 +1,14 @@
//
// FriendsViewController.h
// SlideMenu
//
// Created by Aryan Ghassemi on 12/31/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "SlideNavigationController.h"
@interface FriendsViewController : UITableViewController <SlideNavigationControllerDelegate>
@end

View File

@ -0,0 +1,35 @@
//
// FriendsViewController.m
// SlideMenu
//
// Created by Aryan Ghassemi on 12/31/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import "FriendsViewController.h"
@implementation FriendsViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (BOOL)slideNavigationControllerShouldDisplayLeftMenu
{
return YES;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"friendCell"];
cell.textLabel.text = [NSString stringWithFormat:@"Friend %ld", (long)indexPath.row];
return cell;
}
@end

17
SlideMenu/Helper Classes/HomeViewController.h Normal file → Executable file
View File

@ -11,4 +11,21 @@
@interface HomeViewController : UIViewController <SlideNavigationControllerDelegate> @interface HomeViewController : UIViewController <SlideNavigationControllerDelegate>
@property (nonatomic, strong) IBOutlet UISwitch *limitPanGestureSwitch;
@property (nonatomic, strong) IBOutlet UISwitch *slideOutAnimationSwitch;
@property (nonatomic, strong) IBOutlet UISwitch *shadowSwitch;
@property (nonatomic, strong) IBOutlet UISwitch *panGestureSwitch;
@property (nonatomic, strong) IBOutlet UISegmentedControl *portraitSlideOffsetSegment;
@property (nonatomic, strong) IBOutlet UISegmentedControl *landscapeSlideOffsetSegment;
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;
- (IBAction)bounceMenu:(id)sender;
- (IBAction)slideOutAnimationSwitchChanged:(id)sender;
- (IBAction)limitPanGestureSwitchChanged:(id)sender;
- (IBAction)changeAnimationSelected:(id)sender;
- (IBAction)shadowSwitchSelected:(id)sender;
- (IBAction)enablePanGestureSelected:(id)sender;
- (IBAction)portraitSlideOffsetChanged:(id)sender;
- (IBAction)landscapeSlideOffsetChanged:(id)sender;
@end @end

85
SlideMenu/Helper Classes/HomeViewController.m Normal file → Executable file
View File

@ -7,12 +7,21 @@
// //
#import "HomeViewController.h" #import "HomeViewController.h"
#import "LeftMenuViewController.h"
@implementation HomeViewController @implementation HomeViewController
- (void)viewDidLoad - (void)viewDidLoad
{ {
[super viewDidLoad]; [super viewDidLoad];
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 503);
self.portraitSlideOffsetSegment.selectedSegmentIndex = [self indexFromPixels:[SlideNavigationController sharedInstance].portraitSlideOffset];
self.landscapeSlideOffsetSegment.selectedSegmentIndex = [self indexFromPixels:[SlideNavigationController sharedInstance].landscapeSlideOffset];
self.panGestureSwitch.on = [SlideNavigationController sharedInstance].enableSwipeGesture;
self.shadowSwitch.on = [SlideNavigationController sharedInstance].enableShadow;
self.limitPanGestureSwitch.on = ([SlideNavigationController sharedInstance].panGestureSideOffset == 0) ? NO : YES;
self.slideOutAnimationSwitch.on = ((LeftMenuViewController *)[SlideNavigationController sharedInstance].leftMenu).slideOutAnimationEnabled;
} }
#pragma mark - SlideNavigationController Methods - #pragma mark - SlideNavigationController Methods -
@ -27,4 +36,80 @@
return YES; return YES;
} }
#pragma mark - IBActions -
- (IBAction)bounceMenu:(id)sender
{
static Menu menu = MenuLeft;
[[SlideNavigationController sharedInstance] bounceMenu:menu withCompletion:nil];
menu = (menu == MenuLeft) ? MenuRight : MenuLeft;
}
- (IBAction)slideOutAnimationSwitchChanged:(UISwitch *)sender
{
((LeftMenuViewController *)[SlideNavigationController sharedInstance].leftMenu).slideOutAnimationEnabled = sender.isOn;
}
- (IBAction)limitPanGestureSwitchChanged:(UISwitch *)sender
{
[SlideNavigationController sharedInstance].panGestureSideOffset = (sender.isOn) ? 50 : 0;
}
- (IBAction)changeAnimationSelected:(id)sender
{
[[SlideNavigationController sharedInstance] openMenu:MenuRight withCompletion:nil];
}
- (IBAction)shadowSwitchSelected:(UISwitch *)sender
{
[SlideNavigationController sharedInstance].enableShadow = sender.isOn;
}
- (IBAction)enablePanGestureSelected:(UISwitch *)sender
{
[SlideNavigationController sharedInstance].enableSwipeGesture = sender.isOn;
}
- (IBAction)portraitSlideOffsetChanged:(UISegmentedControl *)sender
{
[SlideNavigationController sharedInstance].portraitSlideOffset = [self pixelsFromIndex:sender.selectedSegmentIndex];
}
- (IBAction)landscapeSlideOffsetChanged:(UISegmentedControl *)sender
{
[SlideNavigationController sharedInstance].landscapeSlideOffset = [self pixelsFromIndex:sender.selectedSegmentIndex];
}
#pragma mark - Helpers -
- (NSInteger)indexFromPixels:(NSInteger)pixels
{
if (pixels == 60)
return 0;
else if (pixels == 120)
return 1;
else
return 2;
}
- (NSInteger)pixelsFromIndex:(NSInteger)index
{
switch (index)
{
case 0:
return 60;
case 1:
return 120;
case 2:
return 200;
default:
return 0;
}
}
@end @end

View File

@ -0,0 +1,17 @@
//
// MenuViewController.h
// SlideMenu
//
// Created by Aryan Gh on 4/24/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "SlideNavigationController.h"
@interface LeftMenuViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@property (nonatomic, assign) BOOL slideOutAnimationEnabled;
@end

View File

@ -0,0 +1,117 @@
//
// MenuViewController.m
// SlideMenu
//
// Created by Aryan Gh on 4/24/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import "LeftMenuViewController.h"
#import "SlideNavigationContorllerAnimatorFade.h"
#import "SlideNavigationContorllerAnimatorSlide.h"
#import "SlideNavigationContorllerAnimatorScale.h"
#import "SlideNavigationContorllerAnimatorScaleAndFade.h"
#import "SlideNavigationContorllerAnimatorSlideAndFade.h"
@implementation LeftMenuViewController
#pragma mark - UIViewController Methods -
- (id)initWithCoder:(NSCoder *)aDecoder
{
self.slideOutAnimationEnabled = YES;
return [super initWithCoder:aDecoder];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.separatorColor = [UIColor lightGrayColor];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"leftMenu.jpg"]];
self.tableView.backgroundView = imageView;
}
#pragma mark - UITableView Delegate & Datasrouce -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 4;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 20)];
view.backgroundColor = [UIColor clearColor];
return view;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"leftMenuCell"];
switch (indexPath.row)
{
case 0:
cell.textLabel.text = @"Home";
break;
case 1:
cell.textLabel.text = @"Profile";
break;
case 2:
cell.textLabel.text = @"Friends";
break;
case 3:
cell.textLabel.text = @"Sign Out";
break;
}
cell.backgroundColor = [UIColor clearColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
bundle: nil];
UIViewController *vc ;
switch (indexPath.row)
{
case 0:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"HomeViewController"];
break;
case 1:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"ProfileViewController"];
break;
case 2:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"FriendsViewController"];
break;
case 3:
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
[[SlideNavigationController sharedInstance] popToRootViewControllerAnimated:YES];
return;
break;
}
[[SlideNavigationController sharedInstance] popToRootAndSwitchToViewController:vc
withSlideOutAnimation:self.slideOutAnimationEnabled
andCompletion:nil];
}
@end

View File

@ -1,16 +0,0 @@
//
// MenuViewController.h
// SlideMenu
//
// Created by Aryan Gh on 4/24/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "SlideNavigationController.h"
@interface MenuViewController : UIViewController <UITableViewDelegate>
@property (nonatomic, strong) NSString *cellIdentifier;
@end

View File

@ -1,68 +0,0 @@
//
// MenuViewController.m
// SlideMenu
//
// Created by Aryan Gh on 4/24/13.
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
//
#import "MenuViewController.h"
@implementation MenuViewController
@synthesize cellIdentifier;
#pragma mark - UITableView Delegate & Datasrouce -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier];
switch (indexPath.row)
{
case 0:
cell.detailTextLabel.text = @"Home";
break;
case 1:
cell.detailTextLabel.text = @"Profile";
break;
case 2:
cell.detailTextLabel.text = @"Friends";
break;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
bundle: nil];
UIViewController *vc ;
switch (indexPath.row)
{
case 0:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"HomeViewController"];
break;
case 1:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"ProfileViewController"];
break;
case 2:
vc = [mainStoryboard instantiateViewControllerWithIdentifier: @"ProfileViewController"];
break;
}
[[SlideNavigationController sharedInstance] switchToViewController:vc withCompletion:nil];
}
@end

0
SlideMenu/Helper Classes/ProfileDetailViewController.h Normal file → Executable file
View File

0
SlideMenu/Helper Classes/ProfileDetailViewController.m Normal file → Executable file
View File

0
SlideMenu/Helper Classes/ProfileViewController.h Normal file → Executable file
View File

0
SlideMenu/Helper Classes/ProfileViewController.m Normal file → Executable file
View File

View File

@ -0,0 +1,21 @@
//
// RightMenuViewController.h
// SlideMenu
//
// Created by Aryan Gh on 4/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "SlideNavigationContorllerAnimator.h"
#import "SlideNavigationContorllerAnimatorFade.h"
#import "SlideNavigationContorllerAnimatorSlide.h"
#import "SlideNavigationContorllerAnimatorScale.h"
#import "SlideNavigationContorllerAnimatorScaleAndFade.h"
#import "SlideNavigationContorllerAnimatorSlideAndFade.h"
@interface RightMenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@end

View File

@ -0,0 +1,127 @@
//
// RightMenuViewController.m
// SlideMenu
//
// Created by Aryan Gh on 4/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
#import "RightMenuViewController.h"
@implementation RightMenuViewController
#pragma mark - UIViewController Methods -
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.separatorColor = [UIColor lightGrayColor];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rightMenu.jpg"]];
self.tableView.backgroundView = imageView;
}
#pragma mark - UITableView Delegate & Datasrouce -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 6;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 20)];
view.backgroundColor = [UIColor clearColor];
return view;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"rightMenuCell"];
switch (indexPath.row)
{
case 0:
cell.textLabel.text = @"None";
break;
case 1:
cell.textLabel.text = @"Slide";
break;
case 2:
cell.textLabel.text = @"Fade";
break;
case 3:
cell.textLabel.text = @"Slide And Fade";
break;
case 4:
cell.textLabel.text = @"Scale";
break;
case 5:
cell.textLabel.text = @"Scale And Fade";
break;
}
cell.backgroundColor = [UIColor clearColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
id <SlideNavigationContorllerAnimator> revealAnimator;
CGFloat animationDuration = 0;
switch (indexPath.row)
{
case 0:
revealAnimator = nil;
animationDuration = .19;
break;
case 1:
revealAnimator = [[SlideNavigationContorllerAnimatorSlide alloc] init];
animationDuration = .19;
break;
case 2:
revealAnimator = [[SlideNavigationContorllerAnimatorFade alloc] init];
animationDuration = .18;
break;
case 3:
revealAnimator = [[SlideNavigationContorllerAnimatorSlideAndFade alloc] initWithMaximumFadeAlpha:.8 fadeColor:[UIColor blackColor] andSlideMovement:100];
animationDuration = .19;
break;
case 4:
revealAnimator = [[SlideNavigationContorllerAnimatorScale alloc] init];
animationDuration = .22;
break;
case 5:
revealAnimator = [[SlideNavigationContorllerAnimatorScaleAndFade alloc] initWithMaximumFadeAlpha:.6 fadeColor:[UIColor blackColor] andMinimumScale:.8];
animationDuration = .22;
break;
default:
return;
}
[[SlideNavigationController sharedInstance] closeMenuWithCompletion:^{
[SlideNavigationController sharedInstance].menuRevealAnimationDuration = animationDuration;
[SlideNavigationController sharedInstance].menuRevealAnimator = revealAnimator;
}];
}
@end

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
SlideMenu/Images/gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -9,7 +9,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string> <string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.aryaxt.${PRODUCT_NAME:rfc1034identifier}</string> <string>com.aryaxt.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
@ -37,6 +37,7 @@
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array> </array>
<key>UISupportedInterfaceOrientations~ipad</key> <key>UISupportedInterfaceOrientations~ipad</key>
<array> <array>

View File

@ -0,0 +1,44 @@
//
// SlideNavigationContorllerAnimation.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationController.h"
@protocol SlideNavigationContorllerAnimator <NSObject>
// Initial state of the view before animation starts
// This gets called right before the menu is about to reveal
- (void)prepareMenuForAnimation:(Menu)menu;
// Animate the view based on the progress (progress is between 0 and 1)
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress;
// Gets called ff for any the instance of animator is being change
// You should make any cleanup that is needed
- (void)clear;
@end

View File

@ -0,0 +1,38 @@
//
// SlideNavigationContorllerAnimationFade.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationContorllerAnimatorFade : NSObject <SlideNavigationContorllerAnimator>
@property (nonatomic, assign) CGFloat maximumFadeAlpha;
@property (nonatomic, strong) UIColor *fadeColor;
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha andFadeColor:(UIColor *)fadeColor;
@end

View File

@ -0,0 +1,89 @@
//
// SlideNavigationContorllerAnimationFade.m
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "SlideNavigationContorllerAnimatorFade.h"
@interface SlideNavigationContorllerAnimatorFade()
@property (nonatomic, strong) UIView *fadeAnimationView;
@end
@implementation SlideNavigationContorllerAnimatorFade
#pragma mark - Initialization -
- (id)init
{
if (self = [self initWithMaximumFadeAlpha:.8 andFadeColor:[UIColor blackColor]])
{
}
return self;
}
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha andFadeColor:(UIColor *)fadeColor
{
if (self = [super init])
{
self.maximumFadeAlpha = maximumFadeAlpha;
self.fadeColor = fadeColor;
self.fadeAnimationView = [[UIView alloc] init];
self.fadeAnimationView.backgroundColor = self.fadeColor;
}
return self;
}
#pragma mark - SlideNavigationContorllerAnimation Methods -
- (void)prepareMenuForAnimation:(Menu)menu
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
self.fadeAnimationView.alpha = self.maximumFadeAlpha;
self.fadeAnimationView.frame = menuViewController.view.bounds;
}
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
self.fadeAnimationView.frame = menuViewController.view.bounds;
[menuViewController.view addSubview:self.fadeAnimationView];
self.fadeAnimationView.alpha = self.maximumFadeAlpha - (self.maximumFadeAlpha *progress);
}
- (void)clear
{
[self.fadeAnimationView removeFromSuperview];
}
@end

View File

@ -0,0 +1,37 @@
//
// SlideNavigationContorllerAnimationScale.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationContorllerAnimatorScale : NSObject <SlideNavigationContorllerAnimator>
@property (nonatomic, assign) CGFloat minimumScale;
- (id)initWithMinimumScale:(CGFloat)minimumScale;
@end

View File

@ -0,0 +1,80 @@
//
// SlideNavigationContorllerAnimationScale.m
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "SlideNavigationContorllerAnimatorScale.h"
@implementation SlideNavigationContorllerAnimatorScale
#pragma mark - Initialization -
- (id)init
{
if (self = [self initWithMinimumScale:.9])
{
}
return self;
}
- (id)initWithMinimumScale:(CGFloat)minimumScale
{
if (self = [super init])
{
self.minimumScale = minimumScale;
}
return self;
}
#pragma mark - SlideNavigationContorllerAnimation Methods -
- (void)prepareMenuForAnimation:(Menu)menu
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
menuViewController.view.transform = CGAffineTransformScale(menuViewController.view.transform, self.minimumScale, self.minimumScale);
}
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
CGFloat scale = MIN(1, (1-self.minimumScale) *progress + self.minimumScale);
menuViewController.view.transform = CGAffineTransformScale([SlideNavigationController sharedInstance].view.transform, scale, scale);
}
- (void)clear
{
[SlideNavigationController sharedInstance].leftMenu.view.transform = CGAffineTransformScale([SlideNavigationController sharedInstance].view.transform, 1, 1);
[SlideNavigationController sharedInstance].rightMenu.view.transform = CGAffineTransformScale([SlideNavigationController sharedInstance].view.transform, 1, 1);
}
@end

View File

@ -0,0 +1,35 @@
//
// SlideNavigationContorllerAnimationScaleAndFade.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationContorllerAnimatorScaleAndFade : NSObject <SlideNavigationContorllerAnimator>
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha fadeColor:(UIColor *)fadeColor andMinimumScale:(CGFloat)minimumScale;
@end

View File

@ -0,0 +1,81 @@
//
// SlideNavigationContorllerAnimationScaleAndFade.m
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "SlideNavigationContorllerAnimatorScaleAndFade.h"
#import "SlideNavigationContorllerAnimatorFade.h"
#import "SlideNavigationContorllerAnimatorScale.h"
@interface SlideNavigationContorllerAnimatorScaleAndFade()
@property (nonatomic, strong) SlideNavigationContorllerAnimatorFade *fadeAnimation;
@property (nonatomic, strong) SlideNavigationContorllerAnimatorScale *scaleAnimation;
@end
@implementation SlideNavigationContorllerAnimatorScaleAndFade
#pragma mark - Initialization -
- (id)init
{
if (self = [self initWithMaximumFadeAlpha:.8 fadeColor:[UIColor blackColor] andMinimumScale:.8])
{
}
return self;
}
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha fadeColor:(UIColor *)fadeColor andMinimumScale:(CGFloat)minimumScale
{
if (self = [super init])
{
self.fadeAnimation = [[SlideNavigationContorllerAnimatorFade alloc] initWithMaximumFadeAlpha:maximumFadeAlpha andFadeColor:fadeColor];
self.scaleAnimation = [[SlideNavigationContorllerAnimatorScale alloc] initWithMinimumScale:minimumScale];
}
return self;
}
#pragma mark - SlideNavigationContorllerAnimation Methods -
- (void)prepareMenuForAnimation:(Menu)menu
{
[self.fadeAnimation prepareMenuForAnimation:menu];
[self.scaleAnimation prepareMenuForAnimation:menu];
}
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress
{
[self.fadeAnimation animateMenu:menu withProgress:progress];
[self.scaleAnimation animateMenu:menu withProgress:progress];
}
- (void)clear
{
[self.fadeAnimation clear];
[self.scaleAnimation clear];
}
@end

View File

@ -0,0 +1,37 @@
//
// SlideNavigationContorllerAnimationSlide.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationContorllerAnimatorSlide : NSObject <SlideNavigationContorllerAnimator>
@property (nonatomic, assign) CGFloat slideMovement;
- (id)initWithSlideMovement:(CGFloat)slideMovement;
@end

View File

@ -0,0 +1,173 @@
//
// SlideNavigationContorllerAnimationSlide.m
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "SlideNavigationContorllerAnimatorSlide.h"
@implementation SlideNavigationContorllerAnimatorSlide
#pragma mark - Initialization -
- (id)init
{
if (self = [self initWithSlideMovement:100])
{
}
return self;
}
- (id)initWithSlideMovement:(CGFloat)slideMovement
{
if (self = [super init])
{
self.slideMovement = slideMovement;
}
return self;
}
#pragma mark - SlideNavigationContorllerAnimation Methods -
- (void)prepareMenuForAnimation:(Menu)menu
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
UIInterfaceOrientation orientation= [SlideNavigationController sharedInstance].interfaceOrientation;
CGRect rect = menuViewController.view.frame;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
rect.origin.x = (menu == MenuLeft) ? self.slideMovement*-1 : self.slideMovement;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
if (orientation == UIInterfaceOrientationLandscapeRight)
{
rect.origin.y = (menu == MenuLeft) ? self.slideMovement*-1 : self.slideMovement;
}
else
{
rect.origin.y = (menu == MenuRight) ? self.slideMovement*-1 : self.slideMovement;
}
}
else
{
if (orientation == UIInterfaceOrientationPortrait)
{
rect.origin.x = (menu == MenuLeft) ? self.slideMovement*-1 : self.slideMovement;
}
else
{
rect.origin.x = (menu == MenuRight) ? self.slideMovement*-1 : self.slideMovement;
}
}
}
menuViewController.view.frame = rect;
}
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
UIInterfaceOrientation orientation = [SlideNavigationController sharedInstance].interfaceOrientation;
NSInteger location = (menu == MenuLeft)
? (self.slideMovement * -1) + (self.slideMovement * progress)
: (self.slideMovement * (1-progress));
if (menu == MenuLeft)
location = (location > 0) ? 0 : location;
if (menu == MenuRight)
location = (location < 0) ? 0 : location;
CGRect rect = menuViewController.view.frame;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
rect.origin.x = location;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
rect.origin.y = (orientation == UIInterfaceOrientationLandscapeRight) ? location : location*-1;
}
else
{
rect.origin.x = (orientation == UIInterfaceOrientationPortrait) ? location : location*-1;
}
}
menuViewController.view.frame = rect;
}
- (void)clear
{
[self clearMenu:MenuLeft];
[self clearMenu:MenuRight];
}
#pragma mark - Private Method -
- (void)clearMenu:(Menu)menu
{
UIViewController *menuViewController = (menu == MenuLeft)
? [SlideNavigationController sharedInstance].leftMenu
: [SlideNavigationController sharedInstance].rightMenu;
UIInterfaceOrientation orientation= [SlideNavigationController sharedInstance].interfaceOrientation;
CGRect rect = menuViewController.view.frame;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
rect.origin.x = 0;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
rect.origin.y = 0;
}
else
{
rect.origin.x = 0;
}
}
menuViewController.view.frame = rect;
}
@end

View File

@ -0,0 +1,35 @@
//
// SlideNavigationContorllerAnimationSlideAndFade.h
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import <Foundation/Foundation.h>
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationContorllerAnimatorSlideAndFade : NSObject <SlideNavigationContorllerAnimator>
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha fadeColor:(UIColor *)fadeColor andSlideMovement:(CGFloat)slideMovement;
@end

View File

@ -0,0 +1,81 @@
//
// SlideNavigationContorllerAnimationSlideAndFade.m
// SlideMenu
//
// Created by Aryan Gh on 1/26/14.
// Copyright (c) 2014 Aryan Ghassemi. All rights reserved.
//
// https://github.com/aryaxt/iOS-Slide-Menu
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import "SlideNavigationContorllerAnimatorSlideAndFade.h"
#import "SlideNavigationContorllerAnimatorSlide.h"
#import "SlideNavigationContorllerAnimatorFade.h"
@interface SlideNavigationContorllerAnimatorSlideAndFade()
@property (nonatomic, strong) SlideNavigationContorllerAnimatorFade *fadeAnimation;
@property (nonatomic, strong) SlideNavigationContorllerAnimatorSlide *slideAnimation;
@end
@implementation SlideNavigationContorllerAnimatorSlideAndFade
#pragma mark - Initialization -
- (id)init
{
if (self = [self initWithMaximumFadeAlpha:.8 fadeColor:[UIColor blackColor] andSlideMovement:100])
{
}
return self;
}
- (id)initWithMaximumFadeAlpha:(CGFloat)maximumFadeAlpha fadeColor:(UIColor *)fadeColor andSlideMovement:(CGFloat)slideMovement
{
if (self = [super init])
{
self.fadeAnimation = [[SlideNavigationContorllerAnimatorFade alloc] initWithMaximumFadeAlpha:maximumFadeAlpha andFadeColor:fadeColor];
self.slideAnimation = [[SlideNavigationContorllerAnimatorSlide alloc] initWithSlideMovement:slideMovement];
}
return self;
}
#pragma mark - SlideNavigationContorllerAnimation Methods -
- (void)prepareMenuForAnimation:(Menu)menu
{
[self.fadeAnimation prepareMenuForAnimation:menu];
[self.slideAnimation prepareMenuForAnimation:menu];
}
- (void)animateMenu:(Menu)menu withProgress:(CGFloat)progress
{
[self.fadeAnimation animateMenu:menu withProgress:progress];
[self.slideAnimation animateMenu:menu withProgress:progress];
}
- (void)clear
{
[self.fadeAnimation clear];
[self.slideAnimation clear];
}
@end

View File

@ -28,6 +28,8 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h> #import <QuartzCore/QuartzCore.h>
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
@protocol SlideNavigationControllerDelegate <NSObject> @protocol SlideNavigationControllerDelegate <NSObject>
@optional @optional
- (BOOL)slideNavigationControllerShouldDisplayRightMenu; - (BOOL)slideNavigationControllerShouldDisplayRightMenu;
@ -35,20 +37,47 @@
@end @end
typedef enum{ typedef enum{
MenuLeft, MenuLeft = 1,
MenuRight, MenuRight = 2
}Menu; }Menu;
@protocol SlideNavigationContorllerAnimator;
@interface SlideNavigationController : UINavigationController <UINavigationControllerDelegate> @interface SlideNavigationController : UINavigationController <UINavigationControllerDelegate>
extern NSString * const SlideNavigationControllerDidOpen;
extern NSString *const SlideNavigationControllerDidClose;
extern NSString *const SlideNavigationControllerDidReveal;
extern NSString *const SlideMenuOpenAfterSwipeKey;
@property (nonatomic, assign) BOOL avoidSwitchingToSameClassViewController; @property (nonatomic, assign) BOOL avoidSwitchingToSameClassViewController;
@property (nonatomic, assign) BOOL enableSwipeGesture; @property (nonatomic, assign) BOOL enableSwipeGesture;
@property (nonatomic, strong) UIViewController *righMenu; @property (nonatomic, assign) BOOL enableShadow;
@property (nonatomic, strong) UIViewController *rightMenu;
@property (nonatomic, strong) UIViewController *leftMenu; @property (nonatomic, strong) UIViewController *leftMenu;
@property (nonatomic, strong) UIBarButtonItem *leftbarButtonItem; @property (nonatomic, strong) UIBarButtonItem *leftBarButtonItem;
@property (nonatomic, strong) UIBarButtonItem *rightBarButtonItem; @property (nonatomic, strong) UIBarButtonItem *rightBarButtonItem;
@property (nonatomic, assign) CGFloat portraitSlideOffset;
@property (nonatomic, assign) CGFloat landscapeSlideOffset;
@property (nonatomic, assign) CGFloat panGestureSideOffset;
@property (nonatomic, assign) CGFloat menuOpenAnimationDuration;
@property (nonatomic, assign) CGFloat menuCloseAnimationDuration;
@property (nonatomic, assign) UIViewAnimationOptions menuRevealAnimationOption;
@property (nonatomic, strong) id <SlideNavigationContorllerAnimator> menuRevealAnimator;
+ (SlideNavigationController *)sharedInstance; + (SlideNavigationController *)sharedInstance;
- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion; - (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion __deprecated;
- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion;
- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion;
- (void)popAllAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion;
- (void)popAllAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion;
- (void)bounceMenu:(Menu)menu withCompletion:(void (^)())completion;
- (void)openMenu:(Menu)menu withCompletion:(void (^)())completion;
- (void)closeMenuWithCompletion:(void (^)())completion;
- (void)toggleLeftMenu;
- (void)toggleRightMenu;
- (BOOL)isMenuOpen;
- (void)prepareMenuForReveal:(Menu)menu;
@end @end

View File

@ -26,27 +26,43 @@
// THE SOFTWARE. // THE SOFTWARE.
#import "SlideNavigationController.h" #import "SlideNavigationController.h"
#import "SlideNavigationContorllerAnimator.h"
@interface SlideNavigationController() typedef enum {
PopTypeAll,
PopTypeRoot
} PopType;
@interface SlideNavigationController() <UIGestureRecognizerDelegate>
@property (nonatomic, strong) UITapGestureRecognizer *tapRecognizer; @property (nonatomic, strong) UITapGestureRecognizer *tapRecognizer;
@property (nonatomic, strong) UIPanGestureRecognizer *panRecognizer; @property (nonatomic, strong) UIPanGestureRecognizer *panRecognizer;
@property (nonatomic, assign) CGPoint draggingPoint; @property (nonatomic, assign) CGPoint draggingPoint;
@property (nonatomic, assign) Menu lastRevealedMenu;
@property (nonatomic, assign) BOOL menuNeedsLayout;
@end @end
@implementation SlideNavigationController @implementation SlideNavigationController
@synthesize righMenu;
@synthesize leftMenu;
@synthesize tapRecognizer;
@synthesize panRecognizer;
@synthesize draggingPoint;
@synthesize leftbarButtonItem;
@synthesize rightBarButtonItem;
@synthesize enableSwipeGesture;
#define MENU_OFFSET 60 NSString * const SlideNavigationControllerDidOpen = @"SlideNavigationControllerDidOpen";
NSString * const SlideNavigationControllerDidClose = @"SlideNavigationControllerDidClose";
NSString *const SlideNavigationControllerDidReveal = @"SlideNavigationControllerDidReveal";
NSString *const SlideMenuOpenAfterSwipeKey = @"SlideMenuOpenAfterSwipeKey";
#define MENU_SLIDE_ANIMATION_DURATION .3 #define MENU_SLIDE_ANIMATION_DURATION .3
#define MENU_QUICK_SLIDE_ANIMATION_DURATION .1 #define MENU_SLIDE_OPEN_ANIMATION_DURATION .4
#define MENU_SLIDE_CLOSE_ANIMATION_DURATION .2
#define MENU_SLIDE_ANIMATION_OPTION UIViewAnimationOptionCurveLinear
#define MENU_QUICK_SLIDE_ANIMATION_DURATION .18
#define MENU_IMAGE @"menu-button" #define MENU_IMAGE @"menu-button"
#define MENU_SHADOW_RADIUS 10
#define MENU_SHADOW_OPACITY 1
#define MENU_DEFAULT_SLIDE_OFFSET 60
#define MENU_FAST_VELOCITY_FOR_SWIPE_FOLLOW_DIRECTION 1200
#define STATUS_BAR_HEIGHT 20
#define NOTIFICATION_USER_INFO_MENU_LEFT @"left"
#define NOTIFICATION_USER_INFO_MENU_RIGHT @"right"
#define NOTIFICATION_USER_INFO_MENU @"menu"
static SlideNavigationController *singletonInstance; static SlideNavigationController *singletonInstance;
@ -54,24 +70,12 @@ static SlideNavigationController *singletonInstance;
+ (SlideNavigationController *)sharedInstance + (SlideNavigationController *)sharedInstance
{ {
if (!singletonInstance)
NSLog(@"SlideNavigationController has not been initialized. Either place one in your storyboard or initialize one in code");
return singletonInstance; return singletonInstance;
} }
- (void)awakeFromNib
{
[self setup];
}
- (id)initWithRootViewController:(UIViewController *)rootViewController
{
if (self = [super initWithRootViewController:rootViewController])
{
[self setup];
}
return self;
}
- (id)init - (id)init
{ {
if (self = [super init]) if (self = [super init])
@ -82,25 +86,135 @@ static SlideNavigationController *singletonInstance;
return self; return self;
} }
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder])
{
[self setup];
}
return self;
}
- (id)initWithRootViewController:(UIViewController *)rootViewController
{
if (self = [super initWithRootViewController:rootViewController])
{
[self setup];
}
return self;
}
- (id)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass
{
if (self = [super initWithNavigationBarClass:navigationBarClass toolbarClass:toolbarClass])
{
[self setup];
}
return self;
}
- (void)setup - (void)setup
{ {
self.avoidSwitchingToSameClassViewController = YES; if (singletonInstance)
NSLog(@"Singleton instance already exists. You can only instantiate one instance of SlideNavigationController. This could cause major issues");
singletonInstance = self; singletonInstance = self;
self.menuOpenAnimationDuration = MENU_SLIDE_OPEN_ANIMATION_DURATION;
self.menuCloseAnimationDuration = MENU_SLIDE_CLOSE_ANIMATION_DURATION;
self.menuRevealAnimationOption = MENU_SLIDE_ANIMATION_OPTION;
self.landscapeSlideOffset = MENU_DEFAULT_SLIDE_OFFSET;
self.portraitSlideOffset = MENU_DEFAULT_SLIDE_OFFSET;
self.panGestureSideOffset = 0;
self.avoidSwitchingToSameClassViewController = YES;
self.enableShadow = YES;
self.enableSwipeGesture = YES;
self.delegate = self; self.delegate = self;
}
self.view.layer.shadowColor = [UIColor darkGrayColor].CGColor; - (void)viewWillLayoutSubviews
self.view.layer.shadowRadius = 10; {
[super viewWillLayoutSubviews];
// Update shadow size of enabled
if (self.enableShadow)
self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath; self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
self.view.layer.shadowOpacity = 1;
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = [UIScreen mainScreen].scale;
[self setEnableSwipeGesture:YES]; // When menu open we disable user interaction
// When rotates we want to make sure that userInteraction is enabled again
//[self enableTapGestureToCloseMenu:NO];
if (self.menuNeedsLayout)
{
[self updateMenuFrameAndTransformAccordingToOrientation];
// Handle different horizontal/vertical slideOffset during rotation
// On iOS below 8 we just close the menu, iOS8 handles rotation better so we support keepiong the menu open
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") && [self isMenuOpen])
{
Menu menu = (self.horizontalLocation > 0) ? MenuLeft : MenuRight;
[self openMenu:menu withCompletion:nil];
}
self.menuNeedsLayout = NO;
}
}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
self.menuNeedsLayout = YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
self.menuNeedsLayout = YES;
} }
#pragma mark - Public Methods - #pragma mark - Public Methods -
- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion - (void)bounceMenu:(Menu)menu withCompletion:(void (^)())completion
{
[self prepareMenuForReveal:menu];
NSInteger movementDirection = (menu == MenuLeft) ? 1 : -1;
[UIView animateWithDuration:.16 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[self moveHorizontallyToLocation:30*movementDirection];
} completion:^(BOOL finished){
[UIView animateWithDuration:.1 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
[self moveHorizontallyToLocation:0];
} completion:^(BOOL finished){
[UIView animateWithDuration:.12 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[self moveHorizontallyToLocation:16*movementDirection];
} completion:^(BOOL finished){
[UIView animateWithDuration:.08 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
[self moveHorizontallyToLocation:0];
} completion:^(BOOL finished){
[UIView animateWithDuration:.08 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[self moveHorizontallyToLocation:6*movementDirection];
} completion:^(BOOL finished){
[UIView animateWithDuration:.06 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
[self moveHorizontallyToLocation:0];
} completion:^(BOOL finished){
if (completion)
completion();
}];
}];
}];
}];
}];
}];
}
- (void)switchToViewController:(UIViewController *)viewController
popType:(PopType)poptype
andCompletion:(void (^)())completion
{ {
if (self.avoidSwitchingToSameClassViewController && [self.topViewController isKindOfClass:viewController.class]) if (self.avoidSwitchingToSameClassViewController && [self.topViewController isKindOfClass:viewController.class])
{ {
@ -108,37 +222,125 @@ static SlideNavigationController *singletonInstance;
return; return;
} }
__block CGRect rect = self.view.frame; void (^switchAndCallCompletion)(BOOL) = ^(BOOL closeMenuBeforeCallingCompletion) {
if (poptype == PopTypeAll) {
if ([self isMenuOpen]) [self setViewControllers:@[viewController]];
{ }
[UIView animateWithDuration:MENU_SLIDE_ANIMATION_DURATION else {
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
rect.origin.x = (rect.origin.x > 0) ? rect.size.width : -1*rect.size.width;
self.view.frame = rect;
} completion:^(BOOL finished) {
[super popToRootViewControllerAnimated:NO]; [super popToRootViewControllerAnimated:NO];
[super pushViewController:viewController animated:NO]; [super pushViewController:viewController animated:NO];
}
if (closeMenuBeforeCallingCompletion)
{
[self closeMenuWithCompletion:^{ [self closeMenuWithCompletion:^{
if (completion) if (completion)
completion(); completion();
}]; }];
}];
} }
else else
{ {
[super popToRootViewControllerAnimated:NO];
[super pushViewController:viewController animated:YES];
if (completion) if (completion)
completion(); completion();
} }
};
// if ([self isMenuOpen])
// {
// if (slideOutAnimation)
// {
// [UIView animateWithDuration:(slideOutAnimation) ? self.menuRevealAnimationDuration : 0
// delay:0
// options:self.menuRevealAnimationOption
// animations:^{
// CGFloat width = self.horizontalSize;
// CGFloat moveLocation = (self.horizontalLocation> 0) ? width : -1*width;
// [self moveHorizontallyToLocation:moveLocation];
// } completion:^(BOOL finished) {
// switchAndCallCompletion(YES);
// }];
// }
// else
// {
// switchAndCallCompletion(YES);
// }
// }
// else
// {
// switchAndCallCompletion(NO);
// }
switchAndCallCompletion([self isMenuOpen]);
} }
- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion
{
[self switchToViewController:viewController popType:PopTypeRoot andCompletion:completion];
}
- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController
withSlideOutAnimation:(BOOL)slideOutAnimation
andCompletion:(void (^)())completion
{
[self switchToViewController:viewController popType:PopTypeRoot andCompletion:completion];
}
- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController
withCompletion:(void (^)())completion
{
[self switchToViewController:viewController popType:PopTypeRoot andCompletion:completion];
}
- (void)popAllAndSwitchToViewController:(UIViewController *)viewController
withSlideOutAnimation:(BOOL)slideOutAnimation
andCompletion:(void (^)())completion
{
[self switchToViewController:viewController popType:PopTypeAll andCompletion:completion];
}
- (void)popAllAndSwitchToViewController:(UIViewController *)viewController
withCompletion:(void (^)())completion
{
[self switchToViewController:viewController popType:PopTypeAll andCompletion:completion];
}
- (void)toggleLeftMenu
{
[self toggleMenu:MenuLeft withCompletion:nil];
}
- (void)toggleRightMenu
{
[self toggleMenu:MenuRight withCompletion:nil];
}
- (BOOL)isMenuOpen
{
return (self.horizontalLocation == 0) ? NO : YES;
}
- (void)setEnableShadow:(BOOL)enable
{
_enableShadow = enable;
if (enable)
{
self.view.layer.shadowColor = [UIColor darkGrayColor].CGColor;
self.view.layer.shadowRadius = MENU_SHADOW_RADIUS;
self.view.layer.shadowOpacity = MENU_SHADOW_OPACITY;
self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = [UIScreen mainScreen].scale;
}
else
{
self.view.layer.shadowOpacity = 0;
self.view.layer.shadowRadius = 0;
}
}
#pragma mark - Override Methods -
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
{ {
if ([self isMenuOpen]) if ([self isMenuOpen])
@ -187,10 +389,49 @@ static SlideNavigationController *singletonInstance;
#pragma mark - Private Methods - #pragma mark - Private Methods -
- (void)updateMenuFrameAndTransformAccordingToOrientation
{
// Animate rotatation when menu is open and device rotates
CGAffineTransform transform = self.view.transform;
self.leftMenu.view.transform = transform;
self.rightMenu.view.transform = transform;
self.leftMenu.view.frame = [self initialRectForMenu];
self.rightMenu.view.frame = [self initialRectForMenu];
}
- (void)enableTapGestureToCloseMenu:(BOOL)enable
{
if (enable)
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
self.interactivePopGestureRecognizer.enabled = NO;
self.topViewController.view.userInteractionEnabled = NO;
[self.view addGestureRecognizer:self.tapRecognizer];
}
else
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
self.interactivePopGestureRecognizer.enabled = YES;
self.topViewController.view.userInteractionEnabled = YES;
[self.view removeGestureRecognizer:self.tapRecognizer];
}
}
- (void)toggleMenu:(Menu)menu withCompletion:(void (^)())completion
{
if ([self isMenuOpen])
[self closeMenuWithCompletion:completion];
else
[self openMenu:menu withCompletion:completion];
}
- (UIBarButtonItem *)barButtonItemForMenu:(Menu)menu - (UIBarButtonItem *)barButtonItemForMenu:(Menu)menu
{ {
SEL selector = (menu == MenuLeft) ? @selector(leftMenuSelected:) : @selector(righttMenuSelected:); SEL selector = (menu == MenuLeft) ? @selector(leftMenuSelected:) : @selector(righttMenuSelected:);
UIBarButtonItem *customButton = (menu == MenuLeft) ? self.leftbarButtonItem : self.rightBarButtonItem; UIBarButtonItem *customButton = (menu == MenuLeft) ? self.leftBarButtonItem : self.rightBarButtonItem;
if (customButton) if (customButton)
{ {
@ -205,11 +446,6 @@ static SlideNavigationController *singletonInstance;
} }
} }
- (BOOL)isMenuOpen
{
return (self.view.frame.origin.x == 0) ? NO : YES;
}
- (BOOL)shouldDisplayMenu:(Menu)menu forViewController:(UIViewController *)vc - (BOOL)shouldDisplayMenu:(Menu)menu forViewController:(UIViewController *)vc
{ {
if (menu == MenuRight) if (menu == MenuRight)
@ -232,74 +468,226 @@ static SlideNavigationController *singletonInstance;
return NO; return NO;
} }
- (void)openMenu:(Menu)menu withDuration:(float)duration andCompletion:(void (^)())completion - (CGFloat)openingPart
{ {
[self.topViewController.view addGestureRecognizer:self.tapRecognizer]; CGFloat slideOffset = self.slideOffset;
CGFloat absHorizontalLocation = (CGFloat)fabs(self.horizontalLocation);
if (menu == MenuLeft) return MIN(1.f, absHorizontalLocation/slideOffset);
{
[self.righMenu.view removeFromSuperview];
[self.view.window insertSubview:self.leftMenu.view atIndex:0];
}
else
{
[self.leftMenu.view removeFromSuperview];
[self.view.window insertSubview:self.righMenu.view atIndex:0];
}
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
CGRect rect = self.view.frame;
rect.origin.x = (menu == MenuLeft) ? (rect.size.width - MENU_OFFSET) : ((rect.size.width - MENU_OFFSET )* -1);
self.view.frame = rect;
}
completion:^(BOOL finished) {
if (completion)
completion();
}];
} }
- (void)openMenu:(Menu)menu withCompletion:(void (^)())completion - (void)openMenu:(Menu)menu withCompletion:(void (^)())completion
{ {
[self openMenu:menu withDuration:MENU_SLIDE_ANIMATION_DURATION andCompletion:completion]; [self openMenu:menu afterSwipe:NO withCompletion:completion];
} }
- (void)closeMenuWithDuration:(float)duration andCompletion:(void (^)())completion - (void)openMenu:(Menu)menu afterSwipe:(BOOL)afterSwipe withCompletion:(void (^)())completion
{ {
[self.topViewController.view removeGestureRecognizer:self.tapRecognizer]; NSTimeInterval duration = self.menuOpenAnimationDuration * (1.f - [self openingPart]);
[self enableTapGestureToCloseMenu:YES];
[self prepareMenuForReveal:menu];
[UIView animateWithDuration:duration [UIView animateWithDuration:duration
delay:0 delay:0
options:UIViewAnimationOptionCurveEaseOut options:self.menuRevealAnimationOption
animations:^{ animations:^{
CGRect rect = self.view.frame; CGRect rect = self.view.frame;
rect.origin.x = 0; CGFloat width = self.horizontalSize;
self.view.frame = rect; rect.origin.x = (menu == MenuLeft) ? (width - self.slideOffset) : ((width - self.slideOffset )* -1);
[self moveHorizontallyToLocation:rect.origin.x];
} }
completion:^(BOOL finished) { completion:^(BOOL finished) {
if (completion) if (completion)
completion(); completion();
[self postNotificationWithName:SlideNavigationControllerDidOpen forMenu:menu withExtParams:@{
SlideMenuOpenAfterSwipeKey : @(afterSwipe)
}];
}]; }];
} }
- (void)closeMenuWithCompletion:(void (^)())completion - (void)closeMenuWithCompletion:(void (^)())completion
{ {
[self closeMenuWithDuration:MENU_SLIDE_ANIMATION_DURATION andCompletion:completion]; NSTimeInterval duration = self.menuCloseAnimationDuration * [self openingPart];
[self enableTapGestureToCloseMenu:NO];
Menu menu = (self.horizontalLocation > 0) ? MenuLeft : MenuRight;
[UIView animateWithDuration:duration
delay:0
options:self.menuRevealAnimationOption
animations:^{
CGRect rect = self.view.frame;
rect.origin.x = 0;
[self moveHorizontallyToLocation:rect.origin.x];
}
completion:^(BOOL finished) {
if (completion)
completion();
[self postNotificationWithName:SlideNavigationControllerDidClose forMenu:menu];
}];
} }
#pragma mark - UINavigationControllerDelegate Methods - - (void)moveHorizontallyToLocation:(CGFloat)location
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{ {
if ([self shouldDisplayMenu:MenuLeft forViewController:viewController]) CGRect rect = self.view.frame;
viewController.navigationItem.leftBarButtonItem = [self barButtonItemForMenu:MenuLeft]; UIInterfaceOrientation orientation = self.interfaceOrientation;
Menu menu = (self.horizontalLocation >= 0 && location >= 0) ? MenuLeft : MenuRight;
if ([self shouldDisplayMenu:MenuRight forViewController:viewController]) if ((location > 0 && self.horizontalLocation <= 0) || (location < 0 && self.horizontalLocation >= 0)) {
viewController.navigationItem.rightBarButtonItem = [self barButtonItemForMenu:MenuRight]; [self postNotificationWithName:SlideNavigationControllerDidReveal forMenu:(location > 0) ? MenuLeft : MenuRight];
}
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
rect.origin.x = location;
rect.origin.y = 0;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
rect.origin.x = 0;
rect.origin.y = (orientation == UIInterfaceOrientationLandscapeRight) ? location : location*-1;
}
else
{
rect.origin.x = (orientation == UIInterfaceOrientationPortrait) ? location : location*-1;
rect.origin.y = 0;
}
}
self.view.frame = rect;
[self updateMenuAnimation:menu];
}
- (void)updateMenuAnimation:(Menu)menu
{
CGFloat progress = (menu == MenuLeft)
? (self.horizontalLocation / (self.horizontalSize - self.slideOffset))
: (self.horizontalLocation / ((self.horizontalSize - self.slideOffset) * -1));
[self.menuRevealAnimator animateMenu:menu withProgress:progress];
}
- (CGRect)initialRectForMenu
{
CGRect rect = self.view.frame;
rect.origin.x = 0;
rect.origin.y = 0;
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
return rect;
}
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
{
// For some reasons in landscape below the status bar is considered y=0, but in portrait it's considered y=20
rect.origin.x = (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) ? 0 : STATUS_BAR_HEIGHT;
rect.size.width = self.view.frame.size.width-STATUS_BAR_HEIGHT;
}
else
{
// For some reasons in landscape below the status bar is considered y=0, but in portrait it's considered y=20
rect.origin.y = (self.interfaceOrientation == UIInterfaceOrientationPortrait) ? STATUS_BAR_HEIGHT : 0;
rect.size.height = self.view.frame.size.height-STATUS_BAR_HEIGHT;
}
return rect;
}
- (void)prepareMenuForReveal:(Menu)menu
{
// Only prepare menu if it has changed (ex: from MenuLeft to MenuRight or vice versa)
if (self.lastRevealedMenu && menu == self.lastRevealedMenu)
return;
UIViewController *menuViewController = (menu == MenuLeft) ? self.leftMenu : self.rightMenu;
UIViewController *removingMenuViewController = (menu == MenuLeft) ? self.rightMenu : self.leftMenu;
self.lastRevealedMenu = menu;
[removingMenuViewController.view removeFromSuperview];
[self.view.window insertSubview:menuViewController.view atIndex:0];
[self updateMenuFrameAndTransformAccordingToOrientation];
[self.menuRevealAnimator prepareMenuForAnimation:menu];
}
- (CGFloat)horizontalLocation
{
CGRect rect = self.view.frame;
UIInterfaceOrientation orientation = self.interfaceOrientation;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
return rect.origin.x;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
return (orientation == UIInterfaceOrientationLandscapeRight)
? rect.origin.y
: rect.origin.y*-1;
}
else
{
return (orientation == UIInterfaceOrientationPortrait)
? rect.origin.x
: rect.origin.x*-1;
}
}
}
- (CGFloat)horizontalSize
{
CGRect rect = self.view.frame;
UIInterfaceOrientation orientation = self.interfaceOrientation;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
return rect.size.width;
}
else
{
if (UIInterfaceOrientationIsLandscape(orientation))
{
return rect.size.height;
}
else
{
return rect.size.width;
}
}
}
- (void)postNotificationWithName:(NSString *)name forMenu:(Menu)menu
{
[self postNotificationWithName:name forMenu:menu withExtParams:nil];
}
- (void)postNotificationWithName:(NSString *)name forMenu:(Menu)menu withExtParams:(NSDictionary *)extParams
{
NSMutableDictionary *userInfo = extParams ? [extParams mutableCopy] : [NSMutableDictionary dictionary];
NSString *menuString = (menu == MenuLeft) ? NOTIFICATION_USER_INFO_MENU_LEFT : NOTIFICATION_USER_INFO_MENU_RIGHT;
userInfo[NOTIFICATION_USER_INFO_MENU] = menuString;
[[NSNotificationCenter defaultCenter] postNotificationName:name object:nil userInfo:[userInfo copy]];
}
- (CGFloat)slideOffset
{
return (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
? self.landscapeSlideOffset
: self.portraitSlideOffset;
} }
#pragma mark - IBActions - #pragma mark - IBActions -
@ -310,7 +698,6 @@ static SlideNavigationController *singletonInstance;
[self closeMenuWithCompletion:nil]; [self closeMenuWithCompletion:nil];
else else
[self openMenu:MenuLeft withCompletion:nil]; [self openMenu:MenuLeft withCompletion:nil];
} }
- (void)righttMenuSelected:(id)sender - (void)righttMenuSelected:(id)sender
@ -328,12 +715,38 @@ static SlideNavigationController *singletonInstance;
[self closeMenuWithCompletion:nil]; [self closeMenuWithCompletion:nil];
} }
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if (self.panGestureSideOffset == 0)
return YES;
CGPoint pointInView = [touch locationInView:self.view];
CGFloat horizontalSize = [self horizontalSize];
return (pointInView.x <= self.panGestureSideOffset || pointInView.x >= horizontalSize - self.panGestureSideOffset)
? YES
: NO;
}
- (void)panDetected:(UIPanGestureRecognizer *)aPanRecognizer - (void)panDetected:(UIPanGestureRecognizer *)aPanRecognizer
{ {
static NSInteger velocityForFollowingDirection = 1000;
CGPoint translation = [aPanRecognizer translationInView:aPanRecognizer.view]; CGPoint translation = [aPanRecognizer translationInView:aPanRecognizer.view];
CGPoint velocity = [aPanRecognizer velocityInView:aPanRecognizer.view]; CGPoint velocity = [aPanRecognizer velocityInView:aPanRecognizer.view];
NSInteger movement = translation.x - self.draggingPoint.x;
Menu currentMenu;
if (self.horizontalLocation > 0)
currentMenu = MenuLeft;
else if (self.horizontalLocation < 0)
currentMenu = MenuRight;
else
currentMenu = (translation.x > 0) ? MenuLeft : MenuRight;
// if (![self shouldDisplayMenu:currentMenu forViewController:self.topViewController])
// return;
[self prepareMenuForReveal:currentMenu];
if (aPanRecognizer.state == UIGestureRecognizerStateBegan) if (aPanRecognizer.state == UIGestureRecognizerStateBegan)
{ {
@ -341,46 +754,38 @@ static SlideNavigationController *singletonInstance;
} }
else if (aPanRecognizer.state == UIGestureRecognizerStateChanged) else if (aPanRecognizer.state == UIGestureRecognizerStateChanged)
{ {
NSInteger movement = translation.x - self.draggingPoint.x; static CGFloat lastHorizontalLocation = 0;
CGRect rect = self.view.frame; CGFloat newHorizontalLocation = [self horizontalLocation];
rect.origin.x += movement; lastHorizontalLocation = newHorizontalLocation;
newHorizontalLocation += movement;
if (rect.origin.x >= self.minXForDragging && rect.origin.x <= self.maxXForDragging) if (newHorizontalLocation >= self.minXForDragging && newHorizontalLocation <= self.maxXForDragging)
self.view.frame = rect; [self moveHorizontallyToLocation:newHorizontalLocation];
self.draggingPoint = translation; self.draggingPoint = translation;
//
if (rect.origin.x > 0)
{
[self.righMenu.view removeFromSuperview];
[self.view.window insertSubview:self.leftMenu.view atIndex:0];
}
else
{
[self.leftMenu.view removeFromSuperview];
[self.view.window insertSubview:self.righMenu.view atIndex:0];
}
} }
else if (aPanRecognizer.state == UIGestureRecognizerStateEnded) else if (aPanRecognizer.state == UIGestureRecognizerStateEnded)
{ {
NSInteger currentX = self.view.frame.origin.x; NSInteger currentX = [self horizontalLocation];
NSInteger currentXOffset = (currentX > 0) ? currentX : currentX * -1; NSInteger currentXOffset = (currentX > 0) ? currentX : currentX * -1;
NSInteger positiveVelocity = (velocity.x > 0) ? velocity.x : velocity.x * -1; NSInteger positiveVelocity = (velocity.x > 0) ? velocity.x : velocity.x * -1;
// If the speed is high enough follow direction // If the speed is high enough follow direction
if (positiveVelocity >= velocityForFollowingDirection) if (positiveVelocity >= MENU_FAST_VELOCITY_FOR_SWIPE_FOLLOW_DIRECTION)
{ {
Menu menu = (velocity.x > 0) ? MenuLeft : MenuRight;
// Moving Right // Moving Right
if (velocity.x > 0) if (velocity.x > 0)
{ {
if (currentX > 0) if (currentX > 0)
{ {
[self openMenu:(velocity.x > 0) ? MenuLeft : MenuRight withCompletion:nil]; if ([self shouldDisplayMenu:menu forViewController:self.visibleViewController])
[self openMenu:(velocity.x > 0) ? MenuLeft : MenuRight afterSwipe:YES withCompletion:nil];
} }
else else
{ {
[self closeMenuWithDuration:MENU_QUICK_SLIDE_ANIMATION_DURATION andCompletion:nil]; [self closeMenuWithCompletion:nil];
} }
} }
// Moving Left // Moving Left
@ -392,16 +797,17 @@ static SlideNavigationController *singletonInstance;
} }
else else
{ {
[self openMenu:(velocity.x > 0) ? MenuLeft : MenuRight withDuration:MENU_QUICK_SLIDE_ANIMATION_DURATION andCompletion:nil]; if ([self shouldDisplayMenu:menu forViewController:self.visibleViewController])
[self openMenu:(velocity.x > 0) ? MenuLeft : MenuRight afterSwipe:YES withCompletion:nil];
} }
} }
} }
else else
{ {
if (currentXOffset < self.view.frame.size.width/2) if (currentXOffset < (self.horizontalSize - self.slideOffset)/2)
[self closeMenuWithCompletion:nil]; [self closeMenuWithCompletion:nil];
else else
[self openMenu:(currentX > 0) ? MenuLeft : MenuRight withCompletion:nil]; [self openMenu:(currentX > 0) ? MenuLeft : MenuRight afterSwipe:YES withCompletion:nil];
} }
} }
} }
@ -410,7 +816,7 @@ static SlideNavigationController *singletonInstance;
{ {
if ([self shouldDisplayMenu:MenuRight forViewController:self.topViewController]) if ([self shouldDisplayMenu:MenuRight forViewController:self.topViewController])
{ {
return (self.view.frame.size.width - MENU_OFFSET) * -1; return (self.horizontalSize - self.slideOffset) * -1;
} }
return 0; return 0;
@ -420,7 +826,7 @@ static SlideNavigationController *singletonInstance;
{ {
if ([self shouldDisplayMenu:MenuLeft forViewController:self.topViewController]) if ([self shouldDisplayMenu:MenuLeft forViewController:self.topViewController])
{ {
return self.view.frame.size.width - MENU_OFFSET; return self.horizontalSize - self.slideOffset;
} }
return 0; return 0;
@ -430,29 +836,30 @@ static SlideNavigationController *singletonInstance;
- (UITapGestureRecognizer *)tapRecognizer - (UITapGestureRecognizer *)tapRecognizer
{ {
if (!tapRecognizer) if (!_tapRecognizer)
{ {
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)]; _tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
} }
return tapRecognizer; return _tapRecognizer;
} }
- (UIPanGestureRecognizer *)panRecognizer - (UIPanGestureRecognizer *)panRecognizer
{ {
if (!panRecognizer) if (!_panRecognizer)
{ {
panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)]; _panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)];
_panRecognizer.delegate = self;
} }
return panRecognizer; return _panRecognizer;
} }
- (void)setEnableSwipeGesture:(BOOL)markEnableSwipeGesture - (void)setEnableSwipeGesture:(BOOL)markEnableSwipeGesture
{ {
enableSwipeGesture = markEnableSwipeGesture; _enableSwipeGesture = markEnableSwipeGesture;
if (enableSwipeGesture) if (_enableSwipeGesture)
{ {
[self.view addGestureRecognizer:self.panRecognizer]; [self.view addGestureRecognizer:self.panRecognizer];
} }
@ -462,4 +869,25 @@ static SlideNavigationController *singletonInstance;
} }
} }
- (void)setMenuRevealAnimator:(id<SlideNavigationContorllerAnimator>)menuRevealAnimator
{
[self.menuRevealAnimator clear];
_menuRevealAnimator = menuRevealAnimator;
}
- (void)setLeftMenu:(UIViewController *)leftMenu
{
[_leftMenu.view removeFromSuperview];
_leftMenu = leftMenu;
}
- (void)setRightMenu:(UIViewController *)rightMenu
{
[_rightMenu.view removeFromSuperview];
_rightMenu = rightMenu;
}
@end @end

View File

@ -1,25 +1,507 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="2519" systemVersion="12A206j" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="2"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4514" systemVersion="13B42" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="fvh-p2-tUE">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1856"/> <deployment defaultVersion="1536" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3746"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--class Prefix:identifier View Controller--> <!--Left Menu View Controller-->
<scene sceneID="4"> <scene sceneID="ydh-RY-veO">
<objects> <objects>
<viewController id="2" customClass="ViewController" sceneMemberID="viewController"> <viewController storyboardIdentifier="LeftMenuViewController" id="kgk-ix-az4" customClass="LeftMenuViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="5"> <layoutGuides>
<rect key="frame" x="0.0" y="20" width="768" height="1004"/> <viewControllerLayoutGuide type="top" id="Gne-ia-o3b"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <viewControllerLayoutGuide type="bottom" id="E2D-Nd-pgy"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="M6Q-7c-6B8">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="4iS-Z1-naI">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<inset key="insetFor6xAndEarlier" minX="0.0" minY="20" maxX="0.0" maxY="0.0"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="leftMenuCell" textLabel="EoR-3O-t6M" style="IBUITableViewCellStyleDefault" id="dX0-0J-330">
<rect key="frame" x="0.0" y="22" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dX0-0J-330" id="ypG-Nr-fsT">
<rect key="frame" x="0.0" y="0.0" width="768" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="EoR-3O-t6M">
<rect key="frame" x="15" y="0.0" width="738" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" name="Georgia-Bold" family="Georgia" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="0.0039215688589999999" green="0.29803922770000002" blue="0.39607846740000002" alpha="1" colorSpace="deviceRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<inset key="separatorInset" minX="15" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="kgk-ix-az4" id="KPu-Yn-RVq"/>
<outlet property="delegate" destination="kgk-ix-az4" id="Q2S-FC-4x0"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
<connections>
<outlet property="tableView" destination="4iS-Z1-naI" id="wIU-s8-EUP"/>
</connections>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="3" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="MPB-tk-CfT" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="-463" y="-315"/>
</scene>
<!--Slide Navigation Controller-->
<scene sceneID="ai6-Og-ggg">
<objects>
<navigationController definesPresentationContext="YES" id="fvh-p2-tUE" customClass="SlideNavigationController" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="s4t-1u-9Dt">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="WYD-AW-Tad" kind="relationship" relationship="rootViewController" id="ZlM-E3-32S"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ZVX-Wl-Kro" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="11" y="49"/>
</scene>
<!--Home View Controller - Home-->
<scene sceneID="jok-Y9-nsU">
<objects>
<viewController storyboardIdentifier="HomeViewController" id="V7R-1j-qkE" customClass="HomeViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="4h0-Bw-69Q"/>
<viewControllerLayoutGuide type="bottom" id="XXp-Rh-R4b"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="htL-MX-nZg">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bn4-DT-fWK">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YJC-mw-uA1">
<rect key="frame" x="3" y="14" width="76" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Push">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<segue destination="4Fv-uA-OED" kind="push" id="iN9-Ny-5e8"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Slide out animation during switch" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="BGW-VE-r3c">
<rect key="frame" x="14" y="64" width="150" height="51"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xi7-6L-7LP">
<rect key="frame" x="675" y="14" width="89" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Bounce Me">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="bounceMenu:" destination="V7R-1j-qkE" eventType="touchUpInside" id="AYn-Cd-Qms"/>
</connections>
</button>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="K17-M3-fdi">
<rect key="frame" x="671" y="74" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="slideOutAnimationSwitchChanged:" destination="V7R-1j-qkE" eventType="valueChanged" id="mPq-Ey-Wdr"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Limit swipe gesture to sides" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="Nud-ee-xnr">
<rect key="frame" x="14" y="238" width="150" height="51"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="JE0-yY-a3F">
<rect key="frame" x="671" y="248" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="limitPanGestureSwitchChanged:" destination="V7R-1j-qkE" eventType="valueChanged" id="Fhj-16-CRo"/>
</connections>
</switch>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xSS-jz-TCM">
<rect key="frame" x="287" y="14" width="141" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Change Animation">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="changeAnimationSelected:" destination="V7R-1j-qkE" eventType="touchUpInside" id="Xka-WC-m6i"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Shadow" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="3EQ-6K-9U6">
<rect key="frame" x="14" y="130" width="150" height="38"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="Drh-pH-upM">
<rect key="frame" x="671" y="131" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="shadowSwitchSelected:" destination="V7R-1j-qkE" eventType="valueChanged" id="DT2-s9-ln1"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Swipe Gesture" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="q9w-JO-G4u">
<rect key="frame" x="14" y="184" width="150" height="38"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="dCe-up-lMi">
<rect key="frame" x="671" y="187" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="enablePanGestureSelected:" destination="V7R-1j-qkE" eventType="valueChanged" id="af0-3l-eWL"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Portrait slide offset" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="trx-fk-BuJ">
<rect key="frame" x="9" y="303" width="150" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="qmn-1J-Alb">
<rect key="frame" x="221" y="344" width="301" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="60 pixels"/>
<segment title="120 pixels"/>
<segment title="200 pixels"/>
</segments>
<connections>
<action selector="portraitSlideOffsetChanged:" destination="V7R-1j-qkE" eventType="valueChanged" id="21Z-jo-Gba"/>
</connections>
</segmentedControl>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Landscape slide offset" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="203" translatesAutoresizingMaskIntoConstraints="NO" id="6aZ-Gf-WRx">
<rect key="frame" x="9" y="379" width="203" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="PTv-Ml-qnn">
<rect key="frame" x="221" y="421" width="301" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="60 pixels"/>
<segment title="120 pixels"/>
<segment title="200 pixels"/>
</segments>
<connections>
<action selector="landscapeSlideOffsetChanged:" destination="V7R-1j-qkE" eventType="valueChanged" id="3xw-Wg-hC0"/>
</connections>
</segmentedControl>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</scrollView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Home" id="DIi-Oq-839"/>
<connections>
<outlet property="landscapeSlideOffsetSegment" destination="PTv-Ml-qnn" id="jEx-Gi-nSR"/>
<outlet property="limitPanGestureSwitch" destination="JE0-yY-a3F" id="AbJ-cJ-5yT"/>
<outlet property="panGestureSwitch" destination="dCe-up-lMi" id="hBX-fq-WuG"/>
<outlet property="portraitSlideOffsetSegment" destination="qmn-1J-Alb" id="Rs5-ve-XJQ"/>
<outlet property="scrollView" destination="bn4-DT-fWK" id="MuQ-al-NSa"/>
<outlet property="shadowSwitch" destination="Drh-pH-upM" id="tYN-aW-vSs"/>
<outlet property="slideOutAnimationSwitch" destination="K17-M3-fdi" id="lGb-Wv-cE6"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ti6-YK-HS7" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1040" y="-222"/>
</scene>
<!--View Controller - No Menu-->
<scene sceneID="vPh-ap-UX3">
<objects>
<viewController id="4Fv-uA-OED" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="pmx-IK-i2u"/>
<viewControllerLayoutGuide type="bottom" id="cGA-iU-ukc"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="rRI-CF-NSd">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="No Menu" id="vf8-FK-eVo">
<barButtonItem key="rightBarButtonItem" id="wha-vg-KIJ">
<segmentedControl key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="NPp-E6-6Ki">
<rect key="frame" x="209" y="8" width="95" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="Seg 1"/>
<segment title="Seg 2"/>
</segments>
</segmentedControl>
</barButtonItem>
</navigationItem>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="4or-Zf-ZK4" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1503" y="-222"/>
</scene>
<!--View Controller - Login-->
<scene sceneID="6xM-VD-IjZ">
<objects>
<viewController id="WYD-AW-Tad" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="iw1-SG-CVt"/>
<viewControllerLayoutGuide type="bottom" id="r3s-gZ-c3b"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="9Q5-n4-47C">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Fake Username" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="YBV-ip-gT9">
<rect key="frame" x="37" y="82" width="236" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Fake Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Ee7-zg-0Cb">
<rect key="frame" x="37" y="139" width="236" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FDT-CQ-1Pc">
<rect key="frame" x="37" y="200" width="70" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Login">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<segue destination="V7R-1j-qkE" kind="push" id="gTa-tR-axC"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Login" id="eie-6f-3Sp"/>
<connections>
<segue destination="7sy-BR-PJy" kind="push" identifier="FakeSegue" id="NSn-aH-3F1"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="TnG-uB-kKy" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="499" y="49"/>
</scene>
<!--Profile View Controller - Profile-->
<scene sceneID="vdg-mb-ElN">
<objects>
<viewController storyboardIdentifier="ProfileViewController" id="7sy-BR-PJy" customClass="ProfileViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="VZj-K9-2cU"/>
<viewControllerLayoutGuide type="bottom" id="rY3-Co-AMw"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="5pS-iy-m6Z">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Rck-5P-us4">
<rect key="frame" x="92" y="178" width="153" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Push To Another PAge">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<segue destination="QUW-hd-dmf" kind="push" identifier="RightMenuOnlySegue" id="GjH-qI-P13"/>
</connections>
</button>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="oRi-zj-G0a">
<rect key="frame" x="85" y="111" width="151" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="random"/>
<segment title="?"/>
</segments>
</segmentedControl>
<slider opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="ZK1-N5-ujV">
<rect key="frame" x="37" y="260" width="216" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</slider>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Profile" id="rim-Qb-Z9f"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="B48-94-l8v" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1044" y="437"/>
</scene>
<!--Friends View Controller - Friends-->
<scene sceneID="nFD-Fx-IfT">
<objects>
<tableViewController storyboardIdentifier="FriendsViewController" title="Friends" id="02e-ia-H3p" customClass="FriendsViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="mf9-Md-XTT">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="friendCell" textLabel="mHc-QQ-efC" style="IBUITableViewCellStyleDefault" id="xWi-Fb-kBs">
<rect key="frame" x="0.0" y="86" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="xWi-Fb-kBs" id="AiF-6v-P9b">
<rect key="frame" x="0.0" y="0.0" width="735" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="mHc-QQ-efC">
<rect key="frame" x="15" y="0.0" width="718" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="ib7-4p-iWa" kind="push" id="pcr-1g-E2h"/>
</connections>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="02e-ia-H3p" id="tRf-va-vVe"/>
<outlet property="delegate" destination="02e-ia-H3p" id="3Bt-bh-0FR"/>
</connections>
</tableView>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="biJ-dS-Jqa" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1042" y="1101"/>
</scene>
<!--View Controller - Friends-->
<scene sceneID="O22-q0-G0O">
<objects>
<viewController title="Friends" id="ib7-4p-iWa" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="PUj-JX-Dzd"/>
<viewControllerLayoutGuide type="bottom" id="aX0-ol-52a"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="NwL-Q3-bld">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Friend Info goes here" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6pu-bb-UuH">
<rect key="frame" x="107" y="43" width="163" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Friend Info" id="87E-5u-pRC"/>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="OO8-ID-dwE" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1503" y="1100"/>
</scene>
<!--Profile Detail View Controller - Right Menu Only-->
<scene sceneID="rfM-Ud-q6T">
<objects>
<viewController storyboardIdentifier="ProfileDetailViewController" id="QUW-hd-dmf" customClass="ProfileDetailViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Cih-DQ-MER"/>
<viewControllerLayoutGuide type="bottom" id="fhz-Is-192"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="uIL-wB-Qgi">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Right Menu Only" id="DCN-Kk-ZXw"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="tHH-ZU-dK5" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1503" y="437"/>
</scene>
<!--Right Menu View Controller-->
<scene sceneID="BnH-4A-xKd">
<objects>
<viewController storyboardIdentifier="RightMenuViewController" id="s8Z-d6-pPO" customClass="RightMenuViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="4FB-gt-Glo"/>
<viewControllerLayoutGuide type="bottom" id="uy1-kw-buA"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="LxO-RZ-XYJ">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="WhB-Xa-VUc">
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<inset key="insetFor6xAndEarlier" minX="0.0" minY="20" maxX="0.0" maxY="0.0"/>
<color key="sectionIndexTrackingBackgroundColor" red="0.83529418710000003" green="0.77647066119999997" blue="0.9450981021" alpha="1" colorSpace="deviceRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="rightMenuCell" textLabel="TLA-lN-Jhv" style="IBUITableViewCellStyleDefault" id="QhH-j0-Isk">
<rect key="frame" x="0.0" y="22" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="QhH-j0-Isk" id="2zc-I9-pbt">
<rect key="frame" x="0.0" y="0.0" width="768" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="TLA-lN-Jhv">
<rect key="frame" x="15" y="0.0" width="738" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" name="Georgia-Bold" family="Georgia" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="0.0039215688589999999" green="0.29803922770000002" blue="0.39607846740000002" alpha="1" colorSpace="deviceRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<inset key="separatorInset" minX="15" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="s8Z-d6-pPO" id="puK-Mm-G9d"/>
<outlet property="delegate" destination="s8Z-d6-pPO" id="xLR-zN-vmb"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="tableView" destination="WhB-Xa-VUc" id="YeN-Ln-HCq"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="eku-Gd-3ad" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-458" y="371"/>
</scene> </scene>
</scenes> </scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics"> <simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/> <simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/> <simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination"/> <simulatedScreenMetrics key="destination"/>
</simulatedMetricsContainer> </simulatedMetricsContainer>

View File

@ -1,9 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="2840" systemVersion="12D78" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="yzD-f0-X8n"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6250" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="yzD-f0-X8n">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1926"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6244"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Left Menu View Controller-->
<scene sceneID="BMU-5d-Lvz">
<objects>
<viewController storyboardIdentifier="LeftMenuViewController" id="L46-bH-G45" customClass="LeftMenuViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="1Ck-cx-0Lt">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="T7T-Ke-Ksy">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<inset key="insetFor6xAndEarlier" minX="0.0" minY="20" maxX="0.0" maxY="0.0"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="leftMenuCell" textLabel="nmX-lO-eSN" style="IBUITableViewCellStyleDefault" id="cLE-GR-3Mi">
<rect key="frame" x="0.0" y="22" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="cLE-GR-3Mi" id="mlz-xO-oOg">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="nmX-lO-eSN">
<rect key="frame" x="15" y="0.0" width="290" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" name="Georgia-Bold" family="Georgia" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="0.0039215688593685627" green="0.29803922772407532" blue="0.39607846736907959" alpha="1" colorSpace="deviceRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<inset key="separatorInset" minX="15" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="L46-bH-G45" id="aGb-Bg-zmt"/>
<outlet property="delegate" destination="L46-bH-G45" id="GKZ-XN-Tto"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="tableView" destination="T7T-Ke-Ksy" id="fWu-ZN-ex0"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="uR4-tD-X8j" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-463" y="-315"/>
</scene>
<!--Slide Navigation Controller--> <!--Slide Navigation Controller-->
<scene sceneID="cQY-wH-O5O"> <scene sceneID="cQY-wH-O5O">
<objects> <objects>
@ -12,61 +63,183 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<connections> <connections>
<segue destination="mAB-md-uek" kind="relationship" relationship="rootViewController" id="z8d-Ml-dpq"/> <segue destination="Rnc-YT-XEu" kind="relationship" relationship="rootViewController" id="Hu2-ne-r2J"/>
<segue destination="nrg-5w-bbF" kind="push" identifier="ProfileSegue" id="VVC-UO-FWZ"/>
</connections> </connections>
</navigationController> </navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="3Qg-wo-U2C" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="3Qg-wo-U2C" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="11" y="49"/> <point key="canvasLocation" x="11" y="49"/>
</scene> </scene>
<!--Home View Controller - Home--> <!--Home-->
<scene sceneID="7Hl-22-JcN"> <scene sceneID="7Hl-22-JcN">
<objects> <objects>
<viewController storyboardIdentifier="HomeViewController" id="mAB-md-uek" customClass="HomeViewController" sceneMemberID="viewController"> <viewController storyboardIdentifier="HomeViewController" id="mAB-md-uek" customClass="HomeViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="KmS-nM-BIh"> <view key="view" contentMode="scaleToFill" id="KmS-nM-BIh">
<rect key="frame" x="0.0" y="64" width="320" height="504"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews> <subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0tp-7h-5YK"> <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="fw2-L4-XnY">
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<state key="normal" title="Button"> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/> <subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="K2W-o4-sG6">
<rect key="frame" x="3" y="14" width="76" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Push">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state> </state>
<state key="highlighted">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections> <connections>
<segue destination="Tha-f2-JWx" kind="push" identifier="NoMenuSegue" id="jGs-V7-na4"/> <segue destination="Tha-f2-JWx" kind="push" id="zQY-ZW-dzI"/>
</connections> </connections>
</button> </button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide out animation during switch" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="LiR-hw-Ca7">
<rect key="frame" x="14" y="64" width="150" height="51"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="RbN-zf-ZQc">
<rect key="frame" x="227" y="14" width="89" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Bounce Me">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="bounceMenu:" destination="mAB-md-uek" eventType="touchUpInside" id="6Xu-R9-337"/>
</connections>
</button>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" id="2Kd-PQ-dMg">
<rect key="frame" x="223" y="74" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="slideOutAnimationSwitchChanged:" destination="mAB-md-uek" eventType="valueChanged" id="Qf2-se-eTN"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Limit swipe gesture to sides" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Zjt-Sm-dG4">
<rect key="frame" x="14" y="238" width="150" height="51"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="83S-hQ-cXn">
<rect key="frame" x="223" y="248" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="limitPanGestureSwitchChanged:" destination="mAB-md-uek" eventType="valueChanged" id="6Hk-Za-6bX"/>
</connections>
</switch>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="t7b-5z-Suv">
<rect key="frame" x="82" y="14" width="141" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Change Animation">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="changeAnimationSelected:" destination="mAB-md-uek" eventType="touchUpInside" id="g8g-m8-C4D"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Shadow" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="u77-ra-SzU">
<rect key="frame" x="14" y="130" width="150" height="38"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="PZ2-xm-500">
<rect key="frame" x="223" y="131" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="shadowSwitchSelected:" destination="mAB-md-uek" eventType="valueChanged" id="eqk-Qq-BQi"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Swipe Gesture" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="k2w-0I-RLF">
<rect key="frame" x="14" y="184" width="150" height="38"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="EFN-Hx-p9d">
<rect key="frame" x="223" y="187" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="enablePanGestureSelected:" destination="mAB-md-uek" eventType="valueChanged" id="TYZ-ji-eFO"/>
</connections>
</switch>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Portrait slide offset" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="URw-TY-n72">
<rect key="frame" x="9" y="303" width="150" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="3av-wh-d4N">
<rect key="frame" x="9" y="344" width="301" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="60 pixels"/>
<segment title="120 pixels"/>
<segment title="200 pixels"/>
</segments>
<connections>
<action selector="portraitSlideOffsetChanged:" destination="mAB-md-uek" eventType="valueChanged" id="WVY-3r-Evr"/>
</connections>
</segmentedControl>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Landscape slide offset" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y2u-M6-whd">
<rect key="frame" x="9" y="379" width="203" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="WQG-lp-diK">
<rect key="frame" x="9" y="421" width="301" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="60 pixels"/>
<segment title="120 pixels"/>
<segment title="200 pixels"/>
</segments>
<connections>
<action selector="landscapeSlideOffsetChanged:" destination="mAB-md-uek" eventType="valueChanged" id="0Y9-hw-fq3"/>
</connections>
</segmentedControl>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</scrollView>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="0tp-7h-5YK" firstAttribute="top" secondItem="KmS-nM-BIh" secondAttribute="top" constant="96" id="my8-MJ-mEI"/>
<constraint firstAttribute="trailing" secondItem="0tp-7h-5YK" secondAttribute="trailing" constant="87" id="s5F-Qo-4kK"/>
</constraints>
</view> </view>
<navigationItem key="navigationItem" title="Home" id="YV6-8b-6Lr"/> <navigationItem key="navigationItem" title="Home" id="YV6-8b-6Lr"/>
<connections>
<outlet property="landscapeSlideOffsetSegment" destination="WQG-lp-diK" id="bG4-OD-XTb"/>
<outlet property="limitPanGestureSwitch" destination="83S-hQ-cXn" id="eBw-Fv-dnh"/>
<outlet property="panGestureSwitch" destination="EFN-Hx-p9d" id="8Cd-Ve-wnb"/>
<outlet property="portraitSlideOffsetSegment" destination="3av-wh-d4N" id="4qf-ty-x48"/>
<outlet property="scrollView" destination="fw2-L4-XnY" id="OLy-l8-yd4"/>
<outlet property="shadowSwitch" destination="PZ2-xm-500" id="50a-xL-hzV"/>
<outlet property="slideOutAnimationSwitch" destination="2Kd-PQ-dMg" id="XTh-Lw-KJw"/>
</connections>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Wf8-rc-ajb" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="Wf8-rc-ajb" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="552" y="-204"/> <point key="canvasLocation" x="1040" y="-222"/>
</scene> </scene>
<!--View Controller - No Menu--> <!--No Menu-->
<scene sceneID="b5b-is-lY2"> <scene sceneID="b5b-is-lY2">
<objects> <objects>
<viewController id="Tha-f2-JWx" sceneMemberID="viewController"> <viewController id="Tha-f2-JWx" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Fks-yk-ua6"> <view key="view" contentMode="scaleToFill" id="Fks-yk-ua6">
<rect key="frame" x="0.0" y="64" width="320" height="504"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
<navigationItem key="navigationItem" title="No Menu" id="k71-Cl-mOP"> <navigationItem key="navigationItem" title="No Menu" id="k71-Cl-mOP">
<barButtonItem key="rightBarButtonItem" id="NgO-HE-8LY"> <barButtonItem key="rightBarButtonItem" id="NgO-HE-8LY">
<segmentedControl key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="nE8-Dp-UZR"> <segmentedControl key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="nE8-Dp-UZR">
<rect key="frame" x="220" y="6" width="95" height="32"/> <rect key="frame" x="209" y="8" width="95" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments> <segments>
<segment title="Seg 1"/> <segment title="Seg 1"/>
@ -78,131 +251,166 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LfU-9k-SWv" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="LfU-9k-SWv" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="1015" y="-204"/> <point key="canvasLocation" x="1503" y="-222"/>
</scene> </scene>
<!--Profile View Controller - Profile--> <!--Login-->
<scene sceneID="fe8-Xu-DEa">
<objects>
<viewController id="Rnc-YT-XEu" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qy8-tT-LdF">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Fake Username" minimumFontSize="17" id="e9E-0E-u4L">
<rect key="frame" x="37" y="82" width="236" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Fake Password" minimumFontSize="17" id="1li-i4-fu1">
<rect key="frame" x="37" y="139" width="236" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="w0t-va-Gly">
<rect key="frame" x="37" y="200" width="70" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Login">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<segue destination="mAB-md-uek" kind="push" id="FfU-Zw-oz1"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Login" id="huN-S6-yGa"/>
<connections>
<segue destination="nrg-5w-bbF" kind="push" identifier="FakeSegue" id="Rkp-YM-Gz0"/>
<segue destination="qY1-Jo-UbZ" kind="push" identifier="FakeSegue33" id="37q-Mo-UFN"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="QC9-GK-F3v" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="499" y="49"/>
</scene>
<!--Profile-->
<scene sceneID="xeE-nX-pb6"> <scene sceneID="xeE-nX-pb6">
<objects> <objects>
<viewController storyboardIdentifier="ProfileViewController" id="nrg-5w-bbF" customClass="ProfileViewController" sceneMemberID="viewController"> <viewController storyboardIdentifier="ProfileViewController" id="nrg-5w-bbF" customClass="ProfileViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="nXC-Mu-u90"> <view key="view" contentMode="scaleToFill" id="nXC-Mu-u90">
<rect key="frame" x="0.0" y="64" width="320" height="504"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews> <subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="coh-kj-UCb"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="coh-kj-UCb">
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/> <rect key="frame" x="92" y="178" width="153" height="30"/>
<state key="normal" title="Button"> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/> <state key="normal" title="Push To Another PAge">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state> </state>
<state key="highlighted">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections> <connections>
<segue destination="BLR-mt-TZ9" kind="push" identifier="RightMenuOnlySegue" id="yr9-GK-Pwl"/> <segue destination="BLR-mt-TZ9" kind="push" identifier="RightMenuOnlySegue" id="yr9-GK-Pwl"/>
</connections> </connections>
</button> </button>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="liN-HX-4nb"> <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="liN-HX-4nb">
<rect key="frame" x="85" y="111" width="151" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments> <segments>
<segment title="First"/> <segment title="random"/>
<segment title="Second"/> <segment title="?"/>
</segments> </segments>
</segmentedControl> </segmentedControl>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="5Jz-Yy-2WY"> <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" id="5Jz-Yy-2WY">
<constraints> <rect key="frame" x="37" y="260" width="216" height="34"/>
<constraint firstAttribute="width" constant="114" id="49B-Qz-2Hc"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</constraints>
</slider> </slider>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="5Jz-Yy-2WY" firstAttribute="top" secondItem="nXC-Mu-u90" secondAttribute="top" constant="251" id="1zS-Ah-2Hz"/>
<constraint firstAttribute="trailing" secondItem="5Jz-Yy-2WY" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="Ein-yb-hQ0"/>
<constraint firstItem="liN-HX-4nb" firstAttribute="leading" secondItem="nXC-Mu-u90" secondAttribute="leading" constant="26" id="mDt-La-5IM"/>
<constraint firstItem="liN-HX-4nb" firstAttribute="top" secondItem="nXC-Mu-u90" secondAttribute="top" constant="32" id="odl-3V-5WW"/>
<constraint firstItem="coh-kj-UCb" firstAttribute="top" secondItem="nXC-Mu-u90" secondAttribute="top" constant="116" id="r8I-zY-MHB"/>
<constraint firstItem="coh-kj-UCb" firstAttribute="leading" secondItem="nXC-Mu-u90" secondAttribute="leading" constant="143" id="wxy-h2-ep0"/>
</constraints>
</view> </view>
<navigationItem key="navigationItem" title="Profile" id="cIB-4y-aS6"/> <navigationItem key="navigationItem" title="Profile" id="cIB-4y-aS6"/>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="BIU-qR-dGC" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="BIU-qR-dGC" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="556" y="455"/> <point key="canvasLocation" x="1044" y="437"/>
</scene> </scene>
<!--Menu View Controller--> <!--Friends-->
<scene sceneID="jnp-rY-eNb"> <scene sceneID="Hbs-BS-FvF">
<objects> <objects>
<viewController storyboardIdentifier="MenuViewController" id="Fo7-mQ-36d" customClass="MenuViewController" sceneMemberID="viewController"> <tableViewController storyboardIdentifier="FriendsViewController" title="Friends" id="qY1-Jo-UbZ" customClass="FriendsViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="SGn-Wf-7bo"> <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="ZVX-Ox-mWb">
<rect key="frame" x="0.0" y="20" width="320" height="548"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="sDo-qF-VCh">
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<prototypes> <prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="rightMenuCell" textLabel="xb6-XA-Fp2" style="IBUITableViewCellStyleDefault" id="xqJ-Km-cL1"> <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="friendCell" textLabel="iWQ-vV-pDm" style="IBUITableViewCellStyleDefault" id="iJ3-ci-bMv">
<rect key="frame" x="0.0" y="22" width="320" height="44"/> <rect key="frame" x="0.0" y="86" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iJ3-ci-bMv" id="c95-tX-Iz4">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/> <rect key="frame" x="0.0" y="0.0" width="287" height="43"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="xb6-XA-Fp2"> <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="iWQ-vV-pDm">
<rect key="frame" x="10" y="0.0" width="300" height="43"/> <rect key="frame" x="15" y="0.0" width="270" height="43"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/> <fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> <nil key="highlightedColor"/>
</label> </label>
</subviews> </subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> </tableViewCellContentView>
</view> <connections>
</tableViewCell> <segue destination="yDw-XY-MRH" kind="push" id="f0p-1d-Bw3"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="leftMenuCell" textLabel="4Da-Pk-Ol7" style="IBUITableViewCellStyleDefault" id="WPD-BV-qjw"> </connections>
<rect key="frame" x="0.0" y="66" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="4Da-Pk-Ol7">
<rect key="frame" x="10" y="0.0" width="300" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
</tableViewCell> </tableViewCell>
</prototypes> </prototypes>
<sections/> <sections/>
<connections> <connections>
<outlet property="dataSource" destination="Fo7-mQ-36d" id="SUU-1c-fBe"/> <outlet property="dataSource" destination="qY1-Jo-UbZ" id="1YL-S4-gBv"/>
<outlet property="delegate" destination="Fo7-mQ-36d" id="djZ-ur-Eos"/> <outlet property="delegate" destination="qY1-Jo-UbZ" id="FT7-ey-Dka"/>
</connections> </connections>
</tableView> </tableView>
</subviews> <navigationItem key="navigationItem" id="aah-ni-z8T">
<color key="backgroundColor" red="0.96439273969999995" green="1" blue="0.19383566830000001" alpha="1" colorSpace="calibratedRGB"/> <barButtonItem key="rightBarButtonItem" title="Random Button" id="UsL-My-2Pu"/>
<constraints> </navigationItem>
<constraint firstItem="sDo-qF-VCh" firstAttribute="bottom" secondItem="SGn-Wf-7bo" secondAttribute="bottom" type="default" id="CIM-le-06X"/> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
<constraint firstItem="sDo-qF-VCh" firstAttribute="top" secondItem="SGn-Wf-7bo" secondAttribute="top" type="default" id="Prl-0H-WcZ"/> </tableViewController>
<constraint firstItem="sDo-qF-VCh" firstAttribute="trailing" secondItem="SGn-Wf-7bo" secondAttribute="trailing" type="default" id="tMP-ja-deS"/> <placeholder placeholderIdentifier="IBFirstResponder" id="TeQ-ZL-OLP" userLabel="First Responder" sceneMemberID="firstResponder"/>
<constraint firstItem="sDo-qF-VCh" firstAttribute="leading" secondItem="SGn-Wf-7bo" secondAttribute="leading" type="default" id="zHf-8s-rjt"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="93v-6G-gvs" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="-508" y="63"/> <point key="canvasLocation" x="1042" y="1101"/>
</scene> </scene>
<!--Profile Detail View Controller - Right Menu Only--> <!--Friends-->
<scene sceneID="yJW-sY-3g9">
<objects>
<viewController title="Friends" id="yDw-XY-MRH" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="iHZ-lt-TwS">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Friend Info goes here" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="fYW-yF-XIJ">
<rect key="frame" x="107" y="43" width="163" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Friend Info" id="ZvF-si-2WZ"/>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="5rh-jR-0iE" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1503" y="1100"/>
</scene>
<!--Right Menu Only-->
<scene sceneID="w1a-xD-Zgv"> <scene sceneID="w1a-xD-Zgv">
<objects> <objects>
<viewController storyboardIdentifier="ProfileDetailViewController" id="BLR-mt-TZ9" customClass="ProfileDetailViewController" sceneMemberID="viewController"> <viewController storyboardIdentifier="ProfileDetailViewController" id="BLR-mt-TZ9" customClass="ProfileDetailViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="pd3-of-ZHU"> <view key="view" contentMode="scaleToFill" id="pd3-of-ZHU">
<rect key="frame" x="0.0" y="64" width="320" height="504"/> <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
@ -210,29 +418,60 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="zoB-W7-tIa" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="zoB-W7-tIa" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="1015" y="455"/> <point key="canvasLocation" x="1503" y="437"/>
</scene>
<!--Right Menu View Controller-->
<scene sceneID="4D0-hr-unv">
<objects>
<viewController storyboardIdentifier="RightMenuViewController" id="CkC-Jl-7gs" customClass="RightMenuViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="PkA-11-xcs">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="rxo-EL-mMo">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<inset key="insetFor6xAndEarlier" minX="0.0" minY="20" maxX="0.0" maxY="0.0"/>
<color key="sectionIndexTrackingBackgroundColor" red="0.83529418710000003" green="0.77647066119999997" blue="0.9450981021" alpha="1" colorSpace="deviceRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="rightMenuCell" textLabel="M7n-za-tWm" style="IBUITableViewCellStyleDefault" id="MFj-zm-kmh">
<rect key="frame" x="0.0" y="22" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MFj-zm-kmh" id="Z1m-Cs-KLm">
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Home" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="M7n-za-tWm">
<rect key="frame" x="15" y="0.0" width="290" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" name="Georgia-Bold" family="Georgia" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="0.0039215688589999999" green="0.29803922770000002" blue="0.39607846740000002" alpha="1" colorSpace="deviceRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<inset key="separatorInset" minX="15" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="CkC-Jl-7gs" id="r1f-eU-lMH"/>
<outlet property="delegate" destination="CkC-Jl-7gs" id="z1c-4e-B0J"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="tableView" destination="rxo-EL-mMo" id="coH-OC-YF2"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dgu-27-ZWK" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-458" y="371"/>
</scene> </scene>
</scenes> </scenes>
<classes>
<class className="HomeViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/HomeViewController.h"/>
</class>
<class className="MenuViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MenuViewController.h"/>
</class>
<class className="NSLayoutConstraint" superclassName="NSObject">
<source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
</class>
<class className="ProfileDetailViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/ProfileDetailViewController.h"/>
</class>
<class className="ProfileViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/ProfileViewController.h"/>
</class>
<class className="SlideNavigationController" superclassName="UINavigationController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/SlideNavigationController.h"/>
</class>
</classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics"> <simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/> <simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/> <simulatedOrientationMetrics key="orientation"/>

View File

@ -6,8 +6,8 @@
// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. // Copyright (c) 2013 Aryan Ghassemi. All rights reserved.
// //
#import <SenTestingKit/SenTestingKit.h> #import <XCTest/XCTest.h>
@interface SlideMenuTests : SenTestCase @interface SlideMenuTests : XCTestCase
@end @end

View File

@ -26,7 +26,7 @@
- (void)testExample - (void)testExample
{ {
STFail(@"Unit tests are not implemented yet in SlideMenuTests"); XCTFail(@"Unit tests are not implemented yet in SlideMenuTests");
} }
@end @end

View File

@ -1,16 +1,16 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'iOS-Slide-Menu' s.name = 'iOS-Slide-Menu'
s.version = '1.0.0' s.version = '1.4.6'
s.summary = 'A Slide Menu for iOS' s.summary = 'A Slide Menu for iOS'
s.homepage = 'https://github.com/aryaxt/iOS-Slide-Menu' s.homepage = 'https://github.com/aryaxt/iOS-Slide-Menu'
s.license = { s.license = {
:type => 'MIT', :type => 'MIT',
:file => 'License.txt' :file => 'License.txt'
} }
s.author = {'Aryan Gh' => 'https://github.com/aryaxt/iOS-Slide-Menu'} s.author = {'Aryan Ghassemi' => 'https://github.com/aryaxt/iOS-Slide-Menu'}
s.source = {:git => 'https://github.com/aryaxt/iOS-Slide-Menu.git', :tag => '1.0.0'} s.source = {:git => 'https://github.com/aryaxt/iOS-Slide-Menu.git', :tag => '1.4.6'}
s.platform = :ios, '6.0' s.platform = :ios, '6.0'
s.source_files = 'SlideMenu/Source/*.{h,m}' s.source_files = 'SlideMenu/Source/*.{h,m}', 'SlideMenu/Source/Animations/*.{h,m}'
s.resources = ['SlideMenu/Source/Assets/**/*'] s.resources = ['SlideMenu/Source/Assets/**/*']
s.framework = 'Foundation', 'UIKit' s.framework = 'Foundation', 'UIKit'
s.requires_arc = true s.requires_arc = true

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
slideMenuAnimation.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB