Repository: romaonthego/RESideMenu Branch: master Commit: 44a22b423720 Files: 68 Total size: 150.8 KB Directory structure: gitextract_tm1asd9d/ ├── Examples/ │ ├── Simple/ │ │ ├── RESideMenuExample/ │ │ │ ├── DEMOAppDelegate.h │ │ │ ├── DEMOAppDelegate.m │ │ │ ├── DEMOFirstViewController.h │ │ │ ├── DEMOFirstViewController.m │ │ │ ├── DEMOLeftMenuViewController.h │ │ │ ├── DEMOLeftMenuViewController.m │ │ │ ├── DEMORightMenuViewController.h │ │ │ ├── DEMORightMenuViewController.m │ │ │ ├── DEMOSecondViewController.h │ │ │ ├── DEMOSecondViewController.m │ │ │ ├── Images.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Balloon.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icon.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── IconCalendar.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── IconEmpty.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── IconHome.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── IconProfile.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── IconSettings.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── LaunchImage.launchimage/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── MenuBackground.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Stars.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── RESideMenuExample-Info.plist │ │ │ ├── RESideMenuExample-Prefix.pch │ │ │ ├── en.lproj/ │ │ │ │ └── InfoPlist.strings │ │ │ └── main.m │ │ └── RESideMenuExample.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── RESideMenuExample.xccheckout │ └── Storyboards/ │ ├── RESideMenuStoryboardsExample/ │ │ ├── Base.lproj/ │ │ │ └── Main.storyboard │ │ ├── DEMOAppDelegate.h │ │ ├── DEMOAppDelegate.m │ │ ├── DEMOFirstViewController.h │ │ ├── DEMOFirstViewController.m │ │ ├── DEMOLeftMenuViewController.h │ │ ├── DEMOLeftMenuViewController.m │ │ ├── DEMORightMenuViewController.h │ │ ├── DEMORightMenuViewController.m │ │ ├── DEMORootViewController.h │ │ ├── DEMORootViewController.m │ │ ├── DEMOSecondViewController.h │ │ ├── DEMOSecondViewController.m │ │ ├── Images.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Balloon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── IconCalendar.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── IconEmpty.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── IconHome.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── IconProfile.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── IconSettings.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── LaunchImage.launchimage/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBackground.imageset/ │ │ │ │ └── Contents.json │ │ │ └── Stars.imageset/ │ │ │ └── Contents.json │ │ ├── RESideMenuStoryboardsExample-Info.plist │ │ ├── RESideMenuStoryboardsExample-Prefix.pch │ │ ├── en.lproj/ │ │ │ └── InfoPlist.strings │ │ └── main.m │ └── RESideMenuStoryboardsExample.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── RESideMenuStoryboardsExample.xccheckout ├── LICENSE ├── README.md ├── RESideMenu/ │ ├── RECommonFunctions.h │ ├── RECommonFunctions.m │ ├── RESideMenu.h │ ├── RESideMenu.m │ ├── UIViewController+RESideMenu.h │ └── UIViewController+RESideMenu.m └── RESideMenu.podspec ================================================ FILE CONTENTS ================================================ ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOAppDelegate.h ================================================ // // DEMOAppDelegate.h // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOAppDelegate.m ================================================ // // DEMOAppDelegate.m // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOAppDelegate.h" #import "DEMOLeftMenuViewController.h" #import "DEMORightMenuViewController.h" #import "DEMOFirstViewController.h" @implementation DEMOAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[DEMOFirstViewController alloc] init]]; DEMOLeftMenuViewController *leftMenuViewController = [[DEMOLeftMenuViewController alloc] init]; DEMORightMenuViewController *rightMenuViewController = [[DEMORightMenuViewController alloc] init]; RESideMenu *sideMenuViewController = [[RESideMenu alloc] initWithContentViewController:navigationController leftMenuViewController:leftMenuViewController rightMenuViewController:rightMenuViewController]; sideMenuViewController.backgroundImage = [UIImage imageNamed:@"Stars"]; sideMenuViewController.menuPreferredStatusBarStyle = 1; // UIStatusBarStyleLightContent sideMenuViewController.delegate = self; sideMenuViewController.contentViewShadowColor = [UIColor blackColor]; sideMenuViewController.contentViewShadowOffset = CGSizeMake(0, 0); sideMenuViewController.contentViewShadowOpacity = 0.6; sideMenuViewController.contentViewShadowRadius = 12; sideMenuViewController.contentViewShadowEnabled = YES; self.window.rootViewController = sideMenuViewController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } #pragma mark - #pragma mark RESideMenu Delegate - (void)sideMenu:(RESideMenu *)sideMenu willShowMenuViewController:(UIViewController *)menuViewController { NSLog(@"willShowMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu didShowMenuViewController:(UIViewController *)menuViewController { NSLog(@"didShowMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu willHideMenuViewController:(UIViewController *)menuViewController { NSLog(@"willHideMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu didHideMenuViewController:(UIViewController *)menuViewController { NSLog(@"didHideMenuViewController: %@", NSStringFromClass([menuViewController class])); } @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOFirstViewController.h ================================================ // // DEMOFirstViewController.h // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOFirstViewController : UIViewController @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOFirstViewController.m ================================================ // // DEMOFirstViewController.m // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOFirstViewController.h" @interface DEMOFirstViewController () @end @implementation DEMOFirstViewController - (void)viewDidLoad { [super viewDidLoad]; self.title = @"First Controller"; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Left" style:UIBarButtonItemStylePlain target:self action:@selector(presentLeftMenuViewController:)]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(presentRightMenuViewController:)]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; imageView.image = [UIImage imageNamed:@"Balloon"]; [self.view addSubview:imageView]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"DEMOFirstViewController will appear"); } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSLog(@"DEMOFirstViewController will disappear"); } @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOLeftMenuViewController.h ================================================ // // DEMOMenuViewController.h // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOLeftMenuViewController : UIViewController @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOLeftMenuViewController.m ================================================ // // DEMOMenuViewController.m // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOLeftMenuViewController.h" #import "DEMOFirstViewController.h" #import "DEMOSecondViewController.h" @interface DEMOLeftMenuViewController () @property (strong, readwrite, nonatomic) UITableView *tableView; @end @implementation DEMOLeftMenuViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = ({ UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - 54 * 5) / 2.0f, self.view.frame.size.width, 54 * 5) style:UITableViewStylePlain]; tableView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; tableView.delegate = self; tableView.dataSource = self; tableView.opaque = NO; tableView.backgroundColor = [UIColor clearColor]; tableView.backgroundView = nil; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.bounces = NO; tableView; }); [self.view addSubview:self.tableView]; } #pragma mark - #pragma mark UITableView Delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (indexPath.row) { case 0: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[[DEMOFirstViewController alloc] init]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; case 1: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[[DEMOSecondViewController alloc] init]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; default: break; } } #pragma mark - #pragma mark UITableView Datasource - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 54; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex { return 5; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; cell.backgroundColor = [UIColor clearColor]; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:21]; cell.textLabel.textColor = [UIColor whiteColor]; cell.textLabel.highlightedTextColor = [UIColor lightGrayColor]; cell.selectedBackgroundView = [[UIView alloc] init]; } NSArray *titles = @[@"Home", @"Calendar", @"Profile", @"Settings", @"Log Out"]; NSArray *images = @[@"IconHome", @"IconCalendar", @"IconProfile", @"IconSettings", @"IconEmpty"]; cell.textLabel.text = titles[indexPath.row]; cell.imageView.image = [UIImage imageNamed:images[indexPath.row]]; return cell; } @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMORightMenuViewController.h ================================================ // // DEMORightMenuViewController.h // RESideMenuExample // // Created by Roman Efimov on 2/11/14. // Copyright (c) 2014 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMORightMenuViewController : UIViewController @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMORightMenuViewController.m ================================================ // // DEMORightMenuViewController.m // RESideMenuExample // // Created by Roman Efimov on 2/11/14. // Copyright (c) 2014 Roman Efimov. All rights reserved. // #import "DEMORightMenuViewController.h" #import "DEMOFirstViewController.h" #import "DEMOSecondViewController.h" #import "DEMOLeftMenuViewController.h" @interface DEMORightMenuViewController () @property (strong, readwrite, nonatomic) UITableView *tableView; @end @implementation DEMORightMenuViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = ({ UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - 54 * 2) / 2.0f, self.view.frame.size.width, 54 * 2) style:UITableViewStylePlain]; tableView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; tableView.delegate = self; tableView.dataSource = self; tableView.opaque = NO; tableView.backgroundColor = [UIColor clearColor]; tableView.backgroundView = nil; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.bounces = NO; tableView; }); [self.view addSubview:self.tableView]; } #pragma mark - #pragma mark UITableView Delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (indexPath.row) { case 0: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[[DEMOFirstViewController alloc] init]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; case 1: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[[DEMOSecondViewController alloc] init]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; default: break; } } #pragma mark - #pragma mark UITableView Datasource - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 54; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex { return 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; cell.backgroundColor = [UIColor clearColor]; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:21]; cell.textLabel.textColor = [UIColor whiteColor]; cell.textLabel.highlightedTextColor = [UIColor lightGrayColor]; cell.selectedBackgroundView = [[UIView alloc] init]; } NSArray *titles = @[@"Test 1", @"Test 2"]; cell.textLabel.text = titles[indexPath.row]; cell.textLabel.textAlignment = NSTextAlignmentRight; return cell; } @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOSecondViewController.h ================================================ // // DEMOSecondViewController.h // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOSecondViewController : UIViewController @end ================================================ FILE: Examples/Simple/RESideMenuExample/DEMOSecondViewController.m ================================================ // // DEMOSecondViewController.m // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOSecondViewController.h" @implementation DEMOSecondViewController - (void)viewDidLoad { [super viewDidLoad]; self.title = @"Second Controller"; self.view.backgroundColor = [UIColor colorWithRed:255/255.0 green:202/255.0 blue:101/255.0 alpha:1.0]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Left" style:UIBarButtonItemStylePlain target:self action:@selector(presentLeftMenuViewController:)]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(presentRightMenuViewController:)]; [self.view addSubview:({ UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(0, 84, self.view.frame.size.width, 44); button.autoresizingMask = UIViewAutoresizingFlexibleWidth; [button setTitle:@"Push View Controller" forState:UIControlStateNormal]; [button addTarget:self action:@selector(pushViewController:) forControlEvents:UIControlEventTouchUpInside]; button; })]; } - (void)pushViewController:(id)sender { UIViewController *viewController = [[UIViewController alloc] init]; viewController.title = @"Pushed Controller"; viewController.view.backgroundColor = [UIColor whiteColor]; [self.navigationController pushViewController:viewController animated:YES]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"DEMOSecondViewController will appear"); } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSLog(@"DEMOSecondViewController will disappear"); } @end ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/Balloon.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Balloon@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/Icon.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Icon@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/IconCalendar.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconCalendar@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/IconEmpty.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconEmpty@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/IconHome.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconHome@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/IconProfile.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconProfile@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/IconSettings.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconSettings@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/LaunchImage.launchimage/Contents.json ================================================ { "images" : [ { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "736h", "filename" : "Default-5.5.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "3x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "667h", "filename" : "Default-4.7.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "retina4", "filename" : "Default-568h@2x.png", "minimum-system-version" : "7.0", "orientation" : "portrait", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/MenuBackground.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "MenuBackground@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/Images.xcassets/Stars.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Stars@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Simple/RESideMenuExample/RESideMenuExample-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName Side Menu CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.romanefimov.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 UIStatusBarStyle UIStatusBarStyleBlackOpaque UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: Examples/Simple/RESideMenuExample/RESideMenuExample-Prefix.pch ================================================ // // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // #import #ifndef __IPHONE_3_0 #warning "This project uses features only available in iOS SDK 3.0 and later." #endif #ifdef __OBJC__ #import #import #endif ================================================ FILE: Examples/Simple/RESideMenuExample/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: Examples/Simple/RESideMenuExample/main.m ================================================ // // main.m // RESideMenuExample // // Created by Roman Efimov on 10/10/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "DEMOAppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([DEMOAppDelegate class])); } } ================================================ FILE: Examples/Simple/RESideMenuExample.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 3032B9131807338200064F85 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3032B9121807338200064F85 /* Foundation.framework */; }; 3032B9151807338200064F85 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3032B9141807338200064F85 /* CoreGraphics.framework */; }; 3032B9171807338200064F85 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3032B9161807338200064F85 /* UIKit.framework */; }; 3032B91D1807338200064F85 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3032B91B1807338200064F85 /* InfoPlist.strings */; }; 3032B91F1807338200064F85 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032B91E1807338200064F85 /* main.m */; }; 3032B9231807338200064F85 /* DEMOAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032B9221807338200064F85 /* DEMOAppDelegate.m */; }; 3032B9251807338200064F85 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3032B9241807338200064F85 /* Images.xcassets */; }; 3032B954180736C900064F85 /* DEMOFirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032B953180736C900064F85 /* DEMOFirstViewController.m */; }; 3032B958180736E200064F85 /* DEMOSecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032B957180736E200064F85 /* DEMOSecondViewController.m */; }; 3032B95E1807372B00064F85 /* DEMOLeftMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3032B95D1807372B00064F85 /* DEMOLeftMenuViewController.m */; }; 3076CE171809B5EF00527E6C /* RECommonFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE121809B5EF00527E6C /* RECommonFunctions.m */; }; 3076CE181809B5EF00527E6C /* RESideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE141809B5EF00527E6C /* RESideMenu.m */; }; 3076CE191809B5EF00527E6C /* UIViewController+RESideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE161809B5EF00527E6C /* UIViewController+RESideMenu.m */; }; 30FE3D1F18AB3B6A003F59ED /* DEMORightMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 30FE3D1E18AB3B6A003F59ED /* DEMORightMenuViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 3032B90F1807338200064F85 /* RESideMenuExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RESideMenuExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3032B9121807338200064F85 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 3032B9141807338200064F85 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 3032B9161807338200064F85 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 3032B91A1807338200064F85 /* RESideMenuExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RESideMenuExample-Info.plist"; sourceTree = ""; }; 3032B91C1807338200064F85 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 3032B91E1807338200064F85 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 3032B9201807338200064F85 /* RESideMenuExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RESideMenuExample-Prefix.pch"; sourceTree = ""; }; 3032B9211807338200064F85 /* DEMOAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DEMOAppDelegate.h; sourceTree = ""; }; 3032B9221807338200064F85 /* DEMOAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DEMOAppDelegate.m; sourceTree = ""; }; 3032B9241807338200064F85 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 3032B92B1807338200064F85 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3032B952180736C900064F85 /* DEMOFirstViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOFirstViewController.h; sourceTree = ""; }; 3032B953180736C900064F85 /* DEMOFirstViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOFirstViewController.m; sourceTree = ""; }; 3032B956180736E200064F85 /* DEMOSecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOSecondViewController.h; sourceTree = ""; }; 3032B957180736E200064F85 /* DEMOSecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOSecondViewController.m; sourceTree = ""; }; 3032B95C1807372B00064F85 /* DEMOLeftMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOLeftMenuViewController.h; sourceTree = ""; }; 3032B95D1807372B00064F85 /* DEMOLeftMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOLeftMenuViewController.m; sourceTree = ""; }; 3076CE111809B5EF00527E6C /* RECommonFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RECommonFunctions.h; sourceTree = ""; }; 3076CE121809B5EF00527E6C /* RECommonFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RECommonFunctions.m; sourceTree = ""; }; 3076CE131809B5EF00527E6C /* RESideMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RESideMenu.h; sourceTree = ""; }; 3076CE141809B5EF00527E6C /* RESideMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RESideMenu.m; sourceTree = ""; }; 3076CE151809B5EF00527E6C /* UIViewController+RESideMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+RESideMenu.h"; sourceTree = ""; }; 3076CE161809B5EF00527E6C /* UIViewController+RESideMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+RESideMenu.m"; sourceTree = ""; }; 30FE3D1D18AB3B6A003F59ED /* DEMORightMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMORightMenuViewController.h; sourceTree = ""; }; 30FE3D1E18AB3B6A003F59ED /* DEMORightMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMORightMenuViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 3032B90C1807338200064F85 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3032B9151807338200064F85 /* CoreGraphics.framework in Frameworks */, 3032B9171807338200064F85 /* UIKit.framework in Frameworks */, 3032B9131807338200064F85 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 3032B9061807338200064F85 = { isa = PBXGroup; children = ( 3076CE101809B5EF00527E6C /* RESideMenu */, 3032B9181807338200064F85 /* RESideMenuExample */, 3032B9111807338200064F85 /* Frameworks */, 3032B9101807338200064F85 /* Products */, ); sourceTree = ""; }; 3032B9101807338200064F85 /* Products */ = { isa = PBXGroup; children = ( 3032B90F1807338200064F85 /* RESideMenuExample.app */, ); name = Products; sourceTree = ""; }; 3032B9111807338200064F85 /* Frameworks */ = { isa = PBXGroup; children = ( 3032B9121807338200064F85 /* Foundation.framework */, 3032B9141807338200064F85 /* CoreGraphics.framework */, 3032B9161807338200064F85 /* UIKit.framework */, 3032B92B1807338200064F85 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; }; 3032B9181807338200064F85 /* RESideMenuExample */ = { isa = PBXGroup; children = ( 3032B9211807338200064F85 /* DEMOAppDelegate.h */, 3032B9221807338200064F85 /* DEMOAppDelegate.m */, 3032B955180736CC00064F85 /* Controllers */, 3032B9191807338200064F85 /* Supporting Files */, ); path = RESideMenuExample; sourceTree = ""; }; 3032B9191807338200064F85 /* Supporting Files */ = { isa = PBXGroup; children = ( 3032B9241807338200064F85 /* Images.xcassets */, 3032B91A1807338200064F85 /* RESideMenuExample-Info.plist */, 3032B91B1807338200064F85 /* InfoPlist.strings */, 3032B91E1807338200064F85 /* main.m */, 3032B9201807338200064F85 /* RESideMenuExample-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 3032B955180736CC00064F85 /* Controllers */ = { isa = PBXGroup; children = ( 3032B952180736C900064F85 /* DEMOFirstViewController.h */, 3032B953180736C900064F85 /* DEMOFirstViewController.m */, 3032B956180736E200064F85 /* DEMOSecondViewController.h */, 3032B957180736E200064F85 /* DEMOSecondViewController.m */, 3032B95C1807372B00064F85 /* DEMOLeftMenuViewController.h */, 3032B95D1807372B00064F85 /* DEMOLeftMenuViewController.m */, 30FE3D1D18AB3B6A003F59ED /* DEMORightMenuViewController.h */, 30FE3D1E18AB3B6A003F59ED /* DEMORightMenuViewController.m */, ); name = Controllers; sourceTree = ""; }; 3076CE101809B5EF00527E6C /* RESideMenu */ = { isa = PBXGroup; children = ( 3076CE111809B5EF00527E6C /* RECommonFunctions.h */, 3076CE121809B5EF00527E6C /* RECommonFunctions.m */, 3076CE131809B5EF00527E6C /* RESideMenu.h */, 3076CE141809B5EF00527E6C /* RESideMenu.m */, 3076CE151809B5EF00527E6C /* UIViewController+RESideMenu.h */, 3076CE161809B5EF00527E6C /* UIViewController+RESideMenu.m */, ); name = RESideMenu; path = ../../RESideMenu; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 3032B90E1807338200064F85 /* RESideMenuExample */ = { isa = PBXNativeTarget; buildConfigurationList = 3032B93B1807338200064F85 /* Build configuration list for PBXNativeTarget "RESideMenuExample" */; buildPhases = ( 3032B90B1807338200064F85 /* Sources */, 3032B90C1807338200064F85 /* Frameworks */, 3032B90D1807338200064F85 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = RESideMenuExample; productName = RESideMenuExample; productReference = 3032B90F1807338200064F85 /* RESideMenuExample.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 3032B9071807338200064F85 /* Project object */ = { isa = PBXProject; attributes = { CLASSPREFIX = DEMO; LastUpgradeCheck = 0510; ORGANIZATIONNAME = "Roman Efimov"; }; buildConfigurationList = 3032B90A1807338200064F85 /* Build configuration list for PBXProject "RESideMenuExample" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 3032B9061807338200064F85; productRefGroup = 3032B9101807338200064F85 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 3032B90E1807338200064F85 /* RESideMenuExample */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 3032B90D1807338200064F85 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 3032B91D1807338200064F85 /* InfoPlist.strings in Resources */, 3032B9251807338200064F85 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 3032B90B1807338200064F85 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3076CE181809B5EF00527E6C /* RESideMenu.m in Sources */, 3032B954180736C900064F85 /* DEMOFirstViewController.m in Sources */, 3032B91F1807338200064F85 /* main.m in Sources */, 3032B95E1807372B00064F85 /* DEMOLeftMenuViewController.m in Sources */, 3032B9231807338200064F85 /* DEMOAppDelegate.m in Sources */, 3032B958180736E200064F85 /* DEMOSecondViewController.m in Sources */, 3076CE171809B5EF00527E6C /* RECommonFunctions.m in Sources */, 3076CE191809B5EF00527E6C /* UIViewController+RESideMenu.m in Sources */, 30FE3D1F18AB3B6A003F59ED /* DEMORightMenuViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 3032B91B1807338200064F85 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 3032B91C1807338200064F85 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 3032B9391807338200064F85 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 3032B93A1807338200064F85 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 3032B93C1807338200064F85 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "RESideMenuExample/RESideMenuExample-Prefix.pch"; INFOPLIST_FILE = "RESideMenuExample/RESideMenuExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; }; 3032B93D1807338200064F85 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "RESideMenuExample/RESideMenuExample-Prefix.pch"; INFOPLIST_FILE = "RESideMenuExample/RESideMenuExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 3032B90A1807338200064F85 /* Build configuration list for PBXProject "RESideMenuExample" */ = { isa = XCConfigurationList; buildConfigurations = ( 3032B9391807338200064F85 /* Debug */, 3032B93A1807338200064F85 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 3032B93B1807338200064F85 /* Build configuration list for PBXNativeTarget "RESideMenuExample" */ = { isa = XCConfigurationList; buildConfigurations = ( 3032B93C1807338200064F85 /* Debug */, 3032B93D1807338200064F85 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 3032B9071807338200064F85 /* Project object */; } ================================================ FILE: Examples/Simple/RESideMenuExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Examples/Simple/RESideMenuExample.xcodeproj/project.xcworkspace/xcshareddata/RESideMenuExample.xccheckout ================================================ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier EA2AA090-2EDD-4770-A786-8CEB4C372394 IDESourceControlProjectName RESideMenuExample IDESourceControlProjectOriginsDictionary 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 ssh://github.com/romaonthego/RESideMenu.git IDESourceControlProjectPath Examples/Simple/RESideMenuExample.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 ../../../.. IDESourceControlProjectURL ssh://github.com/romaonthego/RESideMenu.git IDESourceControlProjectVersion 111 IDESourceControlProjectWCCIdentifier 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 IDESourceControlWCCName RESideMenu ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Base.lproj/Main.storyboard ================================================ ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOAppDelegate.h ================================================ // // DEMOAppDelegate.h // RESideMenuStoryboardsExample // // Created by Roman Efimov on 10/12/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import @interface DEMOAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOAppDelegate.m ================================================ // // DEMOAppDelegate.m // RESideMenuStoryboardsExample // // Created by Roman Efimov on 10/12/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOAppDelegate.h" @implementation DEMOAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOFirstViewController.h ================================================ // // DEMOFirstViewController.h // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOFirstViewController : UIViewController @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOFirstViewController.m ================================================ // // DEMOFirstViewController.m // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOFirstViewController.h" @interface DEMOFirstViewController () @end @implementation DEMOFirstViewController @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOLeftMenuViewController.h ================================================ // // DEMOLeftMenuViewController.h // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOLeftMenuViewController : UIViewController @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOLeftMenuViewController.m ================================================ // // DEMOLeftMenuViewController.m // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOLeftMenuViewController.h" #import "DEMOFirstViewController.h" #import "DEMOSecondViewController.h" #import "UIViewController+RESideMenu.h" @interface DEMOLeftMenuViewController () @property (strong, readwrite, nonatomic) UITableView *tableView; @end @implementation DEMOLeftMenuViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = ({ UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - 54 * 5) / 2.0f, self.view.frame.size.width, 54 * 5) style:UITableViewStylePlain]; tableView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; tableView.delegate = self; tableView.dataSource = self; tableView.opaque = NO; tableView.backgroundColor = [UIColor clearColor]; tableView.backgroundView = nil; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.bounces = NO; tableView.scrollsToTop = NO; tableView; }); [self.view addSubview:self.tableView]; } #pragma mark - #pragma mark UITableView Delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (indexPath.row) { case 0: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"firstViewController"]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; case 1: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; default: break; } } #pragma mark - #pragma mark UITableView Datasource - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 54; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex { return 5; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; cell.backgroundColor = [UIColor clearColor]; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:21]; cell.textLabel.textColor = [UIColor whiteColor]; cell.textLabel.highlightedTextColor = [UIColor lightGrayColor]; cell.selectedBackgroundView = [[UIView alloc] init]; } NSArray *titles = @[@"Home", @"Calendar", @"Profile", @"Settings", @"Log Out"]; NSArray *images = @[@"IconHome", @"IconCalendar", @"IconProfile", @"IconSettings", @"IconEmpty"]; cell.textLabel.text = titles[indexPath.row]; cell.imageView.image = [UIImage imageNamed:images[indexPath.row]]; return cell; } @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMORightMenuViewController.h ================================================ // // DEMORightMenuViewController.h // RESideMenuStoryboards // // Created by Roman Efimov on 2/11/14. // Copyright (c) 2014 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMORightMenuViewController : UIViewController @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMORightMenuViewController.m ================================================ // // DEMORightMenuViewController.m // RESideMenuStoryboards // // Created by Roman Efimov on 2/11/14. // Copyright (c) 2014 Roman Efimov. All rights reserved. // #import "DEMORightMenuViewController.h" #import "DEMOFirstViewController.h" #import "DEMOSecondViewController.h" #import "DEMOLeftMenuViewController.h" @interface DEMORightMenuViewController () @property (strong, readwrite, nonatomic) UITableView *tableView; @end @implementation DEMORightMenuViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = ({ UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - 54 * 2) / 2.0f, self.view.frame.size.width, 54 * 2) style:UITableViewStylePlain]; tableView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; tableView.delegate = self; tableView.dataSource = self; tableView.opaque = NO; tableView.backgroundColor = [UIColor clearColor]; tableView.backgroundView = nil; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.bounces = NO; tableView; }); [self.view addSubview:self.tableView]; } #pragma mark - #pragma mark UITableView Delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (indexPath.row) { case 0: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"firstViewController"]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; case 1: [self.sideMenuViewController setContentViewController:[[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]] animated:YES]; [self.sideMenuViewController hideMenuViewController]; break; default: break; } } #pragma mark - #pragma mark UITableView Datasource - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 54; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex { return 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; cell.backgroundColor = [UIColor clearColor]; cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:21]; cell.textLabel.textColor = [UIColor whiteColor]; cell.textLabel.highlightedTextColor = [UIColor lightGrayColor]; cell.selectedBackgroundView = [[UIView alloc] init]; } NSArray *titles = @[@"Test 1", @"Test 2"]; cell.textLabel.text = titles[indexPath.row]; cell.textLabel.textAlignment = NSTextAlignmentRight; return cell; } @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMORootViewController.h ================================================ // // DEMOViewController.h // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMORootViewController : RESideMenu @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMORootViewController.m ================================================ // // DEMOViewController.m // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMORootViewController.h" #import "DEMOLeftMenuViewController.h" @interface DEMORootViewController () @end @implementation DEMORootViewController - (void)awakeFromNib { self.menuPreferredStatusBarStyle = UIStatusBarStyleLightContent; self.contentViewShadowColor = [UIColor blackColor]; self.contentViewShadowOffset = CGSizeMake(0, 0); self.contentViewShadowOpacity = 0.6; self.contentViewShadowRadius = 12; self.contentViewShadowEnabled = YES; self.contentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"]; self.leftMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"leftMenuViewController"]; self.rightMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"rightMenuViewController"]; self.backgroundImage = [UIImage imageNamed:@"Stars"]; self.delegate = self; } #pragma mark - #pragma mark RESideMenu Delegate - (void)sideMenu:(RESideMenu *)sideMenu willShowMenuViewController:(UIViewController *)menuViewController { NSLog(@"willShowMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu didShowMenuViewController:(UIViewController *)menuViewController { NSLog(@"didShowMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu willHideMenuViewController:(UIViewController *)menuViewController { NSLog(@"willHideMenuViewController: %@", NSStringFromClass([menuViewController class])); } - (void)sideMenu:(RESideMenu *)sideMenu didHideMenuViewController:(UIViewController *)menuViewController { NSLog(@"didHideMenuViewController: %@", NSStringFromClass([menuViewController class])); } @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOSecondViewController.h ================================================ // // DEMOSecondViewController.h // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "RESideMenu.h" @interface DEMOSecondViewController : UIViewController - (IBAction)pushViewController:(id)sender; @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/DEMOSecondViewController.m ================================================ // // DEMOSecondViewController.m // RESideMenuStoryboards // // Created by Roman Efimov on 10/9/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import "DEMOSecondViewController.h" @interface DEMOSecondViewController () @end @implementation DEMOSecondViewController - (IBAction)pushViewController:(id)sender { UIViewController *viewController = [[UIViewController alloc] init]; viewController.title = @"Pushed Controller"; viewController.view.backgroundColor = [UIColor whiteColor]; [self.navigationController pushViewController:viewController animated:YES]; } @end ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/Balloon.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Balloon@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/Icon.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Icon@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/IconCalendar.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconCalendar@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/IconEmpty.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconEmpty@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/IconHome.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconHome@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/IconProfile.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconProfile@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/IconSettings.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "IconSettings@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/LaunchImage.launchimage/Contents.json ================================================ { "images" : [ { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "736h", "filename" : "Default-5.5.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "3x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "667h", "filename" : "Default-4.7.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "retina4", "filename" : "Default-568h@2x.png", "minimum-system-version" : "7.0", "orientation" : "portrait", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/MenuBackground.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "MenuBackground@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/Images.xcassets/Stars.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Stars@2x.png" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier Roman-Efimov.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Prefix.pch ================================================ // // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // #import #ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif #ifdef __OBJC__ #import #import #endif ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample/main.m ================================================ // // main.m // RESideMenuStoryboardsExample // // Created by Roman Efimov on 10/12/13. // Copyright (c) 2013 Roman Efimov. All rights reserved. // #import #import "DEMOAppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([DEMOAppDelegate class])); } } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 3076CDC21809B47200527E6C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3076CDC11809B47200527E6C /* Foundation.framework */; }; 3076CDC41809B47200527E6C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3076CDC31809B47200527E6C /* CoreGraphics.framework */; }; 3076CDC61809B47200527E6C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3076CDC51809B47200527E6C /* UIKit.framework */; }; 3076CDCC1809B47200527E6C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3076CDCA1809B47200527E6C /* InfoPlist.strings */; }; 3076CDCE1809B47200527E6C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CDCD1809B47200527E6C /* main.m */; }; 3076CDD21809B47200527E6C /* DEMOAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CDD11809B47200527E6C /* DEMOAppDelegate.m */; }; 3076CDD51809B47200527E6C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3076CDD31809B47200527E6C /* Main.storyboard */; }; 3076CDDA1809B47200527E6C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3076CDD91809B47200527E6C /* Images.xcassets */; }; 3076CE011809B59E00527E6C /* DEMOFirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CDF81809B59E00527E6C /* DEMOFirstViewController.m */; }; 3076CE021809B59E00527E6C /* DEMOLeftMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CDFA1809B59E00527E6C /* DEMOLeftMenuViewController.m */; }; 3076CE041809B59E00527E6C /* DEMORootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CDFE1809B59E00527E6C /* DEMORootViewController.m */; }; 3076CE051809B59E00527E6C /* DEMOSecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE001809B59E00527E6C /* DEMOSecondViewController.m */; }; 3076CE0D1809B5C500527E6C /* RECommonFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE081809B5C400527E6C /* RECommonFunctions.m */; }; 3076CE0E1809B5C500527E6C /* RESideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE0A1809B5C500527E6C /* RESideMenu.m */; }; 3076CE0F1809B5C500527E6C /* UIViewController+RESideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 3076CE0C1809B5C500527E6C /* UIViewController+RESideMenu.m */; }; 30DF13B218DE1B0C0018463C /* DEMORightMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DF13B118DE1B0C0018463C /* DEMORightMenuViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 3076CDBE1809B47200527E6C /* RESideMenuStoryboardsExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RESideMenuStoryboardsExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3076CDC11809B47200527E6C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 3076CDC31809B47200527E6C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 3076CDC51809B47200527E6C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 3076CDC91809B47200527E6C /* RESideMenuStoryboardsExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RESideMenuStoryboardsExample-Info.plist"; sourceTree = ""; }; 3076CDCB1809B47200527E6C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 3076CDCD1809B47200527E6C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 3076CDCF1809B47200527E6C /* RESideMenuStoryboardsExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RESideMenuStoryboardsExample-Prefix.pch"; sourceTree = ""; }; 3076CDD01809B47200527E6C /* DEMOAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DEMOAppDelegate.h; sourceTree = ""; }; 3076CDD11809B47200527E6C /* DEMOAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DEMOAppDelegate.m; sourceTree = ""; }; 3076CDD41809B47200527E6C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 3076CDD91809B47200527E6C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 3076CDE01809B47200527E6C /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3076CDF71809B59E00527E6C /* DEMOFirstViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOFirstViewController.h; sourceTree = ""; }; 3076CDF81809B59E00527E6C /* DEMOFirstViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOFirstViewController.m; sourceTree = ""; }; 3076CDF91809B59E00527E6C /* DEMOLeftMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOLeftMenuViewController.h; sourceTree = ""; }; 3076CDFA1809B59E00527E6C /* DEMOLeftMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOLeftMenuViewController.m; sourceTree = ""; }; 3076CDFD1809B59E00527E6C /* DEMORootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMORootViewController.h; sourceTree = ""; }; 3076CDFE1809B59E00527E6C /* DEMORootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMORootViewController.m; sourceTree = ""; }; 3076CDFF1809B59E00527E6C /* DEMOSecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMOSecondViewController.h; sourceTree = ""; }; 3076CE001809B59E00527E6C /* DEMOSecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMOSecondViewController.m; sourceTree = ""; }; 3076CE071809B5C400527E6C /* RECommonFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RECommonFunctions.h; sourceTree = ""; }; 3076CE081809B5C400527E6C /* RECommonFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RECommonFunctions.m; sourceTree = ""; }; 3076CE091809B5C400527E6C /* RESideMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RESideMenu.h; sourceTree = ""; }; 3076CE0A1809B5C500527E6C /* RESideMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RESideMenu.m; sourceTree = ""; }; 3076CE0B1809B5C500527E6C /* UIViewController+RESideMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+RESideMenu.h"; sourceTree = ""; }; 3076CE0C1809B5C500527E6C /* UIViewController+RESideMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+RESideMenu.m"; sourceTree = ""; }; 30DF13B018DE1B0C0018463C /* DEMORightMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DEMORightMenuViewController.h; sourceTree = ""; }; 30DF13B118DE1B0C0018463C /* DEMORightMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DEMORightMenuViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 3076CDBB1809B47200527E6C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3076CDC41809B47200527E6C /* CoreGraphics.framework in Frameworks */, 3076CDC61809B47200527E6C /* UIKit.framework in Frameworks */, 3076CDC21809B47200527E6C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 3076CDB51809B47200527E6C = { isa = PBXGroup; children = ( 3076CE061809B5C400527E6C /* RESideMenu */, 3076CDC71809B47200527E6C /* RESideMenuStoryboardsExample */, 3076CDC01809B47200527E6C /* Frameworks */, 3076CDBF1809B47200527E6C /* Products */, ); sourceTree = ""; }; 3076CDBF1809B47200527E6C /* Products */ = { isa = PBXGroup; children = ( 3076CDBE1809B47200527E6C /* RESideMenuStoryboardsExample.app */, ); name = Products; sourceTree = ""; }; 3076CDC01809B47200527E6C /* Frameworks */ = { isa = PBXGroup; children = ( 3076CDC11809B47200527E6C /* Foundation.framework */, 3076CDC31809B47200527E6C /* CoreGraphics.framework */, 3076CDC51809B47200527E6C /* UIKit.framework */, 3076CDE01809B47200527E6C /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; }; 3076CDC71809B47200527E6C /* RESideMenuStoryboardsExample */ = { isa = PBXGroup; children = ( 3076CDF61809B50100527E6C /* Controllers */, 3076CDD01809B47200527E6C /* DEMOAppDelegate.h */, 3076CDD11809B47200527E6C /* DEMOAppDelegate.m */, 3076CDD31809B47200527E6C /* Main.storyboard */, 3076CDC81809B47200527E6C /* Supporting Files */, ); path = RESideMenuStoryboardsExample; sourceTree = ""; }; 3076CDC81809B47200527E6C /* Supporting Files */ = { isa = PBXGroup; children = ( 3076CDD91809B47200527E6C /* Images.xcassets */, 3076CDC91809B47200527E6C /* RESideMenuStoryboardsExample-Info.plist */, 3076CDCA1809B47200527E6C /* InfoPlist.strings */, 3076CDCD1809B47200527E6C /* main.m */, 3076CDCF1809B47200527E6C /* RESideMenuStoryboardsExample-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 3076CDF61809B50100527E6C /* Controllers */ = { isa = PBXGroup; children = ( 3076CDFD1809B59E00527E6C /* DEMORootViewController.h */, 3076CDFE1809B59E00527E6C /* DEMORootViewController.m */, 3076CDF71809B59E00527E6C /* DEMOFirstViewController.h */, 3076CDF81809B59E00527E6C /* DEMOFirstViewController.m */, 3076CDFF1809B59E00527E6C /* DEMOSecondViewController.h */, 3076CE001809B59E00527E6C /* DEMOSecondViewController.m */, 3076CDF91809B59E00527E6C /* DEMOLeftMenuViewController.h */, 3076CDFA1809B59E00527E6C /* DEMOLeftMenuViewController.m */, 30DF13B018DE1B0C0018463C /* DEMORightMenuViewController.h */, 30DF13B118DE1B0C0018463C /* DEMORightMenuViewController.m */, ); name = Controllers; sourceTree = ""; }; 3076CE061809B5C400527E6C /* RESideMenu */ = { isa = PBXGroup; children = ( 3076CE071809B5C400527E6C /* RECommonFunctions.h */, 3076CE081809B5C400527E6C /* RECommonFunctions.m */, 3076CE091809B5C400527E6C /* RESideMenu.h */, 3076CE0A1809B5C500527E6C /* RESideMenu.m */, 3076CE0B1809B5C500527E6C /* UIViewController+RESideMenu.h */, 3076CE0C1809B5C500527E6C /* UIViewController+RESideMenu.m */, ); name = RESideMenu; path = ../../RESideMenu; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 3076CDBD1809B47200527E6C /* RESideMenuStoryboardsExample */ = { isa = PBXNativeTarget; buildConfigurationList = 3076CDF01809B47200527E6C /* Build configuration list for PBXNativeTarget "RESideMenuStoryboardsExample" */; buildPhases = ( 3076CDBA1809B47200527E6C /* Sources */, 3076CDBB1809B47200527E6C /* Frameworks */, 3076CDBC1809B47200527E6C /* Resources */, ); buildRules = ( ); dependencies = ( ); name = RESideMenuStoryboardsExample; productName = RESideMenuStoryboardsExample; productReference = 3076CDBE1809B47200527E6C /* RESideMenuStoryboardsExample.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 3076CDB61809B47200527E6C /* Project object */ = { isa = PBXProject; attributes = { CLASSPREFIX = DEMO; LastUpgradeCheck = 0510; ORGANIZATIONNAME = "Roman Efimov"; }; buildConfigurationList = 3076CDB91809B47200527E6C /* Build configuration list for PBXProject "RESideMenuStoryboardsExample" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 3076CDB51809B47200527E6C; productRefGroup = 3076CDBF1809B47200527E6C /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 3076CDBD1809B47200527E6C /* RESideMenuStoryboardsExample */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 3076CDBC1809B47200527E6C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 3076CDDA1809B47200527E6C /* Images.xcassets in Resources */, 3076CDCC1809B47200527E6C /* InfoPlist.strings in Resources */, 3076CDD51809B47200527E6C /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 3076CDBA1809B47200527E6C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3076CE021809B59E00527E6C /* DEMOLeftMenuViewController.m in Sources */, 3076CE011809B59E00527E6C /* DEMOFirstViewController.m in Sources */, 3076CDCE1809B47200527E6C /* main.m in Sources */, 3076CDD21809B47200527E6C /* DEMOAppDelegate.m in Sources */, 3076CE051809B59E00527E6C /* DEMOSecondViewController.m in Sources */, 30DF13B218DE1B0C0018463C /* DEMORightMenuViewController.m in Sources */, 3076CE041809B59E00527E6C /* DEMORootViewController.m in Sources */, 3076CE0F1809B5C500527E6C /* UIViewController+RESideMenu.m in Sources */, 3076CE0E1809B5C500527E6C /* RESideMenu.m in Sources */, 3076CE0D1809B5C500527E6C /* RECommonFunctions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 3076CDCA1809B47200527E6C /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 3076CDCB1809B47200527E6C /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 3076CDD31809B47200527E6C /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 3076CDD41809B47200527E6C /* Base */, ); name = Main.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 3076CDEE1809B47200527E6C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 3076CDEF1809B47200527E6C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 3076CDF11809B47200527E6C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Prefix.pch"; INFOPLIST_FILE = "RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; }; 3076CDF21809B47200527E6C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Prefix.pch"; INFOPLIST_FILE = "RESideMenuStoryboardsExample/RESideMenuStoryboardsExample-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 3076CDB91809B47200527E6C /* Build configuration list for PBXProject "RESideMenuStoryboardsExample" */ = { isa = XCConfigurationList; buildConfigurations = ( 3076CDEE1809B47200527E6C /* Debug */, 3076CDEF1809B47200527E6C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 3076CDF01809B47200527E6C /* Build configuration list for PBXNativeTarget "RESideMenuStoryboardsExample" */ = { isa = XCConfigurationList; buildConfigurations = ( 3076CDF11809B47200527E6C /* Debug */, 3076CDF21809B47200527E6C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 3076CDB61809B47200527E6C /* Project object */; } ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Examples/Storyboards/RESideMenuStoryboardsExample.xcodeproj/project.xcworkspace/xcshareddata/RESideMenuStoryboardsExample.xccheckout ================================================ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier 3879733F-3A95-4277-B781-69031D14BC32 IDESourceControlProjectName RESideMenuStoryboardsExample IDESourceControlProjectOriginsDictionary 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 ssh://github.com/romaonthego/RESideMenu.git IDESourceControlProjectPath Examples/Storyboards/RESideMenuStoryboardsExample.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 ../../../.. IDESourceControlProjectURL ssh://github.com/romaonthego/RESideMenu.git IDESourceControlProjectVersion 111 IDESourceControlProjectWCCIdentifier 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey 4D9AE519C7D7E765CA7498EFD8B3BB24ACB11215 IDESourceControlWCCName RESideMenu ================================================ FILE: LICENSE ================================================ Copyright (c) 2013 Roman Efimov (https://github.com/romaonthego). 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. ================================================ FILE: README.md ================================================ # RESideMenu iOS 7/8 style side menu with parallax effect inspired by Dribbble shots ([first](http://dribbble.com/shots/1116265-Instasave-iPhone-App) and [second](http://dribbble.com/shots/1114754-Social-Feed-iOS7)). Since version 4.0 you can add menu view controllers on both left and right sides of your content view controller. RESideMenu Screenshot RESideMenu Screenshot ## Requirements * Xcode 6 or higher * Apple LLVM compiler * iOS 6.0 or higher * ARC ## Demo Build and run the `RESideMenuExample` project in Xcode to see `RESideMenu` in action. For storyboards integration demo, build and run `RESideMenuStoryboardsExample`. ## Installation ### CocoaPods The recommended approach for installating `RESideMenu` is via the [CocoaPods](http://cocoapods.org/) package manager, as it provides flexible dependency management and dead simple installation. For best results, it is recommended that you install via CocoaPods >= **0.28.0** using Git >= **1.8.0** installed via Homebrew. Install CocoaPods if not already available: ``` bash $ [sudo] gem install cocoapods $ pod setup ``` Change to the directory of your Xcode project: ``` bash $ cd /path/to/MyProject $ touch Podfile $ edit Podfile ``` Edit your Podfile and add RESideMenu: ``` bash platform :ios, '6.0' pod 'RESideMenu', '~> 4.0.7' ``` Install into your Xcode project: ``` bash $ pod install ``` Open your project in Xcode from the .xcworkspace file (not the usual project file) ``` bash $ open MyProject.xcworkspace ``` Please note that if your installation fails, it may be because you are installing with a version of Git lower than CocoaPods is expecting. Please ensure that you are running Git >= **1.8.0** by executing `git --version`. You can get a full picture of the installation details by executing `pod install --verbose`. ### Manual Install All you need to do is drop `RESideMenu` files into your project, and add `#include "RESideMenu.h"` to the top of classes that will use it. ## Example Usage In your AppDelegate's `- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` create the view controller and assign content and menu view controllers. ``` objective-c // Create content and menu controllers // DEMONavigationController *navigationController = [[DEMONavigationController alloc] initWithRootViewController:[[DEMOHomeViewController alloc] init]]; DEMOLeftMenuViewController *leftMenuViewController = [[DEMOLeftMenuViewController alloc] init]; DEMORightMenuViewController *rightMenuViewController = [[DEMORightMenuViewController alloc] init]; // Create side menu controller // RESideMenu *sideMenuViewController = [[RESideMenu alloc] initWithContentViewController:navigationController leftMenuViewController:leftMenuViewController rightMenuViewController:rightMenuViewController]; sideMenuViewController.backgroundImage = [UIImage imageNamed:@"Stars"]; // Make it a root controller // self.window.rootViewController = sideMenuViewController; ``` Present the menu view controller: ```objective-c [self.sideMenuViewController presentLeftMenuViewController]; ``` or ```objective-c [self.sideMenuViewController presentRightMenuViewController]; ``` Switch content view controllers: ```objective-c #import .... [self.sideMenuViewController setContentViewController:viewController animated:YES]; [self.sideMenuViewController hideMenuViewController]; ``` ## Storyboards Example 1. Create a subclass of `RESideMenu`. In this example we call it `DEMORootViewController`. 2. In the Storyboard designate the root view's owner as `DEMORootViewController`. 3. Make sure to `#import "RESideMenu.h"` in `DEMORootViewController.h`. 4. Add more view controllers to your Storyboard, and give them identifiers "leftMenuViewController", "rightMenuViewController" and "contentViewController". Note that in the new XCode the identifier is called "Storyboard ID" and can be found in the Identity inspector. 5. Add a method `awakeFromNib` to `DEMORootViewController.m` with the following code: ```objective-c - (void)awakeFromNib { self.contentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"]; self.leftMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"leftMenuViewController"]; self.rightMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"rightMenuViewController"]; } ``` ## Customization You can customize the following properties of `RESideMenu`: ``` objective-c @property (assign, readwrite, nonatomic) NSTimeInterval animationDuration; @property (strong, readwrite, nonatomic) UIImage *backgroundImage; @property (assign, readwrite, nonatomic) BOOL panGestureEnabled; @property (assign, readwrite, nonatomic) BOOL panFromEdge; @property (assign, readwrite, nonatomic) NSUInteger panMinimumOpenThreshold; @property (assign, readwrite, nonatomic) BOOL interactivePopGestureRecognizerEnabled; @property (assign, readwrite, nonatomic) BOOL scaleContentView; @property (assign, readwrite, nonatomic) BOOL scaleBackgroundImageView; @property (assign, readwrite, nonatomic) BOOL scaleMenuView; @property (assign, readwrite, nonatomic) BOOL contentViewShadowEnabled; @property (assign, readwrite, nonatomic) UIColor *contentViewShadowColor; @property (assign, readwrite, nonatomic) CGSize contentViewShadowOffset; @property (assign, readwrite, nonatomic) CGFloat contentViewShadowOpacity; @property (assign, readwrite, nonatomic) CGFloat contentViewShadowRadius; @property (assign, readwrite, nonatomic) CGFloat contentViewScaleValue; @property (assign, readwrite, nonatomic) CGFloat contentViewInLandscapeOffsetCenterX; @property (assign, readwrite, nonatomic) CGFloat contentViewInPortraitOffsetCenterX; @property (assign, readwrite, nonatomic) CGFloat parallaxMenuMinimumRelativeValue; @property (assign, readwrite, nonatomic) CGFloat parallaxMenuMaximumRelativeValue; @property (assign, readwrite, nonatomic) CGFloat parallaxContentMinimumRelativeValue; @property (assign, readwrite, nonatomic) CGFloat parallaxContentMaximumRelativeValue; @property (assign, readwrite, nonatomic) CGAffineTransform menuViewControllerTransformation; @property (assign, readwrite, nonatomic) BOOL parallaxEnabled; @property (assign, readwrite, nonatomic) BOOL bouncesHorizontally; @property (assign, readwrite, nonatomic) UIStatusBarStyle menuPreferredStatusBarStyle; @property (assign, readwrite, nonatomic) BOOL menuPrefersStatusBarHidden; ``` If you set a backgroundImage, don't forget to set the Menu View Controller's background color to clear color. You can implement `RESideMenuDelegate` protocol to receive the following messages: ```objective-c - (void)sideMenu:(RESideMenu *)sideMenu didRecognizePanGesture:(UIPanGestureRecognizer *)recognizer; - (void)sideMenu:(RESideMenu *)sideMenu willShowMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu didShowMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu willHideMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu didHideMenuViewController:(UIViewController *)menuViewController; ``` ## Contact Roman Efimov - https://github.com/romaonthego - https://twitter.com/romaonthego - romefimov@gmail.com ## License RESideMenu is available under the MIT license. Copyright © 2013 Roman Efimov. 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. ================================================ FILE: RESideMenu/RECommonFunctions.h ================================================ // // RECommonFunctions.h // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 #ifndef REUIKitIsFlatMode #define REUIKitIsFlatMode() RESideMenuUIKitIsFlatMode() #endif #ifndef kCFCoreFoundationVersionNumber_iOS_6_1 #define kCFCoreFoundationVersionNumber_iOS_6_1 793.00 #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 #define IF_IOS7_OR_GREATER(...) \ if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \ { \ __VA_ARGS__ \ } #else #define IF_IOS7_OR_GREATER(...) #endif BOOL RESideMenuUIKitIsFlatMode(void); ================================================ FILE: RESideMenu/RECommonFunctions.m ================================================ // // RECommonFunctions.m // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 "RECommonFunctions.h" #import BOOL RESideMenuUIKitIsFlatMode(void) { static BOOL isUIKitFlatMode = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (floor(NSFoundationVersionNumber) > 993.0) { // If your app is running in legacy mode, tintColor will be nil - else it must be set to some color. if (UIApplication.sharedApplication.keyWindow) { isUIKitFlatMode = [UIApplication.sharedApplication.delegate.window performSelector:@selector(tintColor)] != nil; } else { // Possible that we're called early on (e.g. when used in a Storyboard). Adapt and use a temporary window. isUIKitFlatMode = [[UIWindow new] performSelector:@selector(tintColor)] != nil; } } }); return isUIKitFlatMode; } ================================================ FILE: RESideMenu/RESideMenu.h ================================================ // // REFrostedViewController.h // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 #import "UIViewController+RESideMenu.h" #ifndef IBInspectable #define IBInspectable #endif @protocol RESideMenuDelegate; @interface RESideMenu : UIViewController #if __IPHONE_8_0 @property (strong, readwrite, nonatomic) IBInspectable NSString *contentViewStoryboardID; @property (strong, readwrite, nonatomic) IBInspectable NSString *leftMenuViewStoryboardID; @property (strong, readwrite, nonatomic) IBInspectable NSString *rightMenuViewStoryboardID; #endif @property (strong, readwrite, nonatomic) UIViewController *contentViewController; @property (strong, readwrite, nonatomic) UIViewController *leftMenuViewController; @property (strong, readwrite, nonatomic) UIViewController *rightMenuViewController; @property (weak, readwrite, nonatomic) id delegate; @property (assign, readwrite, nonatomic) NSTimeInterval animationDuration; @property (strong, readwrite, nonatomic) UIImage *backgroundImage; @property (assign, readwrite, nonatomic) BOOL panGestureEnabled; @property (assign, readwrite, nonatomic) BOOL panFromEdge; @property (assign, readwrite, nonatomic) NSUInteger panMinimumOpenThreshold; @property (assign, readwrite, nonatomic) IBInspectable BOOL interactivePopGestureRecognizerEnabled; @property (assign, readwrite, nonatomic) IBInspectable BOOL fadeMenuView; @property (assign, readwrite, nonatomic) IBInspectable BOOL scaleContentView; @property (assign, readwrite, nonatomic) IBInspectable BOOL scaleBackgroundImageView; @property (assign, readwrite, nonatomic) IBInspectable BOOL scaleMenuView; @property (assign, readwrite, nonatomic) IBInspectable BOOL contentViewShadowEnabled; @property (strong, readwrite, nonatomic) IBInspectable UIColor *contentViewShadowColor; @property (assign, readwrite, nonatomic) IBInspectable CGSize contentViewShadowOffset; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewShadowOpacity; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewShadowRadius; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewFadeOutAlpha; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewScaleValue; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewInLandscapeOffsetCenterX; @property (assign, readwrite, nonatomic) IBInspectable CGFloat contentViewInPortraitOffsetCenterX; @property (assign, readwrite, nonatomic) IBInspectable CGFloat parallaxMenuMinimumRelativeValue; @property (assign, readwrite, nonatomic) IBInspectable CGFloat parallaxMenuMaximumRelativeValue; @property (assign, readwrite, nonatomic) IBInspectable CGFloat parallaxContentMinimumRelativeValue; @property (assign, readwrite, nonatomic) IBInspectable CGFloat parallaxContentMaximumRelativeValue; @property (assign, readwrite, nonatomic) CGAffineTransform menuViewControllerTransformation; @property (assign, readwrite, nonatomic) IBInspectable BOOL parallaxEnabled; @property (assign, readwrite, nonatomic) IBInspectable BOOL bouncesHorizontally; @property (assign, readwrite, nonatomic) UIStatusBarStyle menuPreferredStatusBarStyle; @property (assign, readwrite, nonatomic) IBInspectable BOOL menuPrefersStatusBarHidden; - (id)initWithContentViewController:(UIViewController *)contentViewController leftMenuViewController:(UIViewController *)leftMenuViewController rightMenuViewController:(UIViewController *)rightMenuViewController; - (void)presentLeftMenuViewController; - (void)presentRightMenuViewController; - (void)hideMenuViewController; - (void)setContentViewController:(UIViewController *)contentViewController animated:(BOOL)animated; @end @protocol RESideMenuDelegate @optional - (void)sideMenu:(RESideMenu *)sideMenu didRecognizePanGesture:(UIPanGestureRecognizer *)recognizer; - (void)sideMenu:(RESideMenu *)sideMenu willShowMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu didShowMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu willHideMenuViewController:(UIViewController *)menuViewController; - (void)sideMenu:(RESideMenu *)sideMenu didHideMenuViewController:(UIViewController *)menuViewController; @end ================================================ FILE: RESideMenu/RESideMenu.m ================================================ // // REFrostedViewController.m // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 "RESideMenu.h" #import "UIViewController+RESideMenu.h" #import "RECommonFunctions.h" @interface RESideMenu () @property (strong, readwrite, nonatomic) UIImageView *backgroundImageView; @property (assign, readwrite, nonatomic) BOOL visible; @property (assign, readwrite, nonatomic) BOOL leftMenuVisible; @property (assign, readwrite, nonatomic) BOOL rightMenuVisible; @property (assign, readwrite, nonatomic) CGPoint originalPoint; @property (strong, readwrite, nonatomic) UIButton *contentButton; @property (strong, readwrite, nonatomic) UIView *menuViewContainer; @property (strong, readwrite, nonatomic) UIView *contentViewContainer; @property (assign, readwrite, nonatomic) BOOL didNotifyDelegate; @end @implementation RESideMenu #pragma mark - #pragma mark Instance lifecycle - (id)init { self = [super init]; if (self) { [self commonInit]; } return self; } - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { [self commonInit]; } return self; } #if __IPHONE_8_0 - (void)awakeFromNib { if (self.contentViewStoryboardID) { self.contentViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.contentViewStoryboardID]; } if (self.leftMenuViewStoryboardID) { self.leftMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.leftMenuViewStoryboardID]; } if (self.rightMenuViewStoryboardID) { self.rightMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.rightMenuViewStoryboardID]; } } #endif - (void)commonInit { _menuViewContainer = [[UIView alloc] init]; _contentViewContainer = [[UIView alloc] init]; _animationDuration = 0.35f; _interactivePopGestureRecognizerEnabled = YES; _menuViewControllerTransformation = CGAffineTransformMakeScale(1.5f, 1.5f); _scaleContentView = YES; _scaleBackgroundImageView = YES; _scaleMenuView = YES; _fadeMenuView = YES; _parallaxEnabled = YES; _parallaxMenuMinimumRelativeValue = -15; _parallaxMenuMaximumRelativeValue = 15; _parallaxContentMinimumRelativeValue = -25; _parallaxContentMaximumRelativeValue = 25; _bouncesHorizontally = YES; _panGestureEnabled = YES; _panFromEdge = YES; _panMinimumOpenThreshold = 60.0; _contentViewShadowEnabled = NO; _contentViewShadowColor = [UIColor blackColor]; _contentViewShadowOffset = CGSizeZero; _contentViewShadowOpacity = 0.4f; _contentViewShadowRadius = 8.0f; _contentViewFadeOutAlpha = 1.0f; _contentViewInLandscapeOffsetCenterX = 30.f; _contentViewInPortraitOffsetCenterX = 30.f; _contentViewScaleValue = 0.7f; } #pragma mark - #pragma mark Public methods - (id)initWithContentViewController:(UIViewController *)contentViewController leftMenuViewController:(UIViewController *)leftMenuViewController rightMenuViewController:(UIViewController *)rightMenuViewController { self = [self init]; if (self) { _contentViewController = contentViewController; _leftMenuViewController = leftMenuViewController; _rightMenuViewController = rightMenuViewController; } return self; } - (void)presentLeftMenuViewController { [self presentMenuViewContainerWithMenuViewController:self.leftMenuViewController]; [self showLeftMenuViewController]; } - (void)presentRightMenuViewController { [self presentMenuViewContainerWithMenuViewController:self.rightMenuViewController]; [self showRightMenuViewController]; } - (void)hideMenuViewController { [self hideMenuViewControllerAnimated:YES]; } - (void)setContentViewController:(UIViewController *)contentViewController animated:(BOOL)animated { if (_contentViewController == contentViewController) { return; } if (!animated) { [self setContentViewController:contentViewController]; } else { [self addChildViewController:contentViewController]; contentViewController.view.alpha = 0; contentViewController.view.frame = self.contentViewContainer.bounds; [self.contentViewContainer addSubview:contentViewController.view]; [UIView animateWithDuration:self.animationDuration animations:^{ contentViewController.view.alpha = 1; } completion:^(BOOL finished) { [self hideViewController:self.contentViewController]; [contentViewController didMoveToParentViewController:self]; _contentViewController = contentViewController; [self statusBarNeedsAppearanceUpdate]; [self updateContentViewShadow]; if (self.visible) { [self addContentViewControllerMotionEffects]; } }]; } } #pragma mark View life cycle - (void)viewDidLoad { [super viewDidLoad]; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.backgroundImageView = ({ UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; imageView.image = self.backgroundImage; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; imageView; }); self.contentButton = ({ UIButton *button = [[UIButton alloc] initWithFrame:CGRectNull]; [button addTarget:self action:@selector(hideMenuViewController) forControlEvents:UIControlEventTouchUpInside]; button; }); [self.view addSubview:self.backgroundImageView]; [self.view addSubview:self.menuViewContainer]; [self.view addSubview:self.contentViewContainer]; self.menuViewContainer.frame = self.view.bounds; self.menuViewContainer.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; if (self.leftMenuViewController) { [self addChildViewController:self.leftMenuViewController]; self.leftMenuViewController.view.frame = self.view.bounds; self.leftMenuViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.menuViewContainer addSubview:self.leftMenuViewController.view]; [self.leftMenuViewController didMoveToParentViewController:self]; } if (self.rightMenuViewController) { [self addChildViewController:self.rightMenuViewController]; self.rightMenuViewController.view.frame = self.view.bounds; self.rightMenuViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.menuViewContainer addSubview:self.rightMenuViewController.view]; [self.rightMenuViewController didMoveToParentViewController:self]; } self.contentViewContainer.frame = self.view.bounds; self.contentViewContainer.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self addChildViewController:self.contentViewController]; self.contentViewController.view.frame = self.view.bounds; [self.contentViewContainer addSubview:self.contentViewController.view]; [self.contentViewController didMoveToParentViewController:self]; self.menuViewContainer.alpha = !self.fadeMenuView ?: 0; if (self.scaleBackgroundImageView) self.backgroundImageView.transform = CGAffineTransformMakeScale(1.7f, 1.7f); [self addMenuViewControllerMotionEffects]; if (self.panGestureEnabled) { self.view.multipleTouchEnabled = NO; UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognized:)]; panGestureRecognizer.delegate = self; [self.view addGestureRecognizer:panGestureRecognizer]; } [self updateContentViewShadow]; } #pragma mark - #pragma mark Private methods - (void)presentMenuViewContainerWithMenuViewController:(UIViewController *)menuViewController { self.menuViewContainer.transform = CGAffineTransformIdentity; if (self.scaleBackgroundImageView) { self.backgroundImageView.transform = CGAffineTransformIdentity; self.backgroundImageView.frame = self.view.bounds; } self.menuViewContainer.frame = self.view.bounds; if (self.scaleMenuView) { self.menuViewContainer.transform = self.menuViewControllerTransformation; } self.menuViewContainer.alpha = !self.fadeMenuView ?: 0; if (self.scaleBackgroundImageView) self.backgroundImageView.transform = CGAffineTransformMakeScale(1.7f, 1.7f); if ([self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:willShowMenuViewController:)]) { [self.delegate sideMenu:self willShowMenuViewController:menuViewController]; } } - (void)showLeftMenuViewController { if (!self.leftMenuViewController) { return; } [self.leftMenuViewController beginAppearanceTransition:YES animated:YES]; self.leftMenuViewController.view.hidden = NO; self.rightMenuViewController.view.hidden = YES; [self.view.window endEditing:YES]; [self addContentButton]; [self updateContentViewShadow]; [self resetContentViewScale]; [UIView animateWithDuration:self.animationDuration animations:^{ if (self.scaleContentView) { self.contentViewContainer.transform = CGAffineTransformMakeScale(self.contentViewScaleValue, self.contentViewScaleValue); } else { self.contentViewContainer.transform = CGAffineTransformIdentity; } if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) { self.contentViewContainer.center = CGPointMake((UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? self.contentViewInLandscapeOffsetCenterX + CGRectGetWidth(self.view.frame) : self.contentViewInPortraitOffsetCenterX + CGRectGetWidth(self.view.frame)), self.contentViewContainer.center.y); } else { self.contentViewContainer.center = CGPointMake((UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? self.contentViewInLandscapeOffsetCenterX + CGRectGetHeight(self.view.frame) : self.contentViewInPortraitOffsetCenterX + CGRectGetWidth(self.view.frame)), self.contentViewContainer.center.y); } self.menuViewContainer.alpha = !self.fadeMenuView ?: 1.0f; self.contentViewContainer.alpha = self.contentViewFadeOutAlpha; self.menuViewContainer.transform = CGAffineTransformIdentity; if (self.scaleBackgroundImageView) self.backgroundImageView.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [self addContentViewControllerMotionEffects]; [self.leftMenuViewController endAppearanceTransition]; if (!self.visible && [self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:didShowMenuViewController:)]) { [self.delegate sideMenu:self didShowMenuViewController:self.leftMenuViewController]; } self.visible = YES; self.leftMenuVisible = YES; }]; [self statusBarNeedsAppearanceUpdate]; } - (void)showRightMenuViewController { if (!self.rightMenuViewController) { return; } [self.rightMenuViewController beginAppearanceTransition:YES animated:YES]; self.leftMenuViewController.view.hidden = YES; self.rightMenuViewController.view.hidden = NO; [self.view.window endEditing:YES]; [self addContentButton]; [self updateContentViewShadow]; [self resetContentViewScale]; [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; [UIView animateWithDuration:self.animationDuration animations:^{ if (self.scaleContentView) { self.contentViewContainer.transform = CGAffineTransformMakeScale(self.contentViewScaleValue, self.contentViewScaleValue); } else { self.contentViewContainer.transform = CGAffineTransformIdentity; } self.contentViewContainer.center = CGPointMake((UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? -self.contentViewInLandscapeOffsetCenterX : -self.contentViewInPortraitOffsetCenterX), self.contentViewContainer.center.y); self.menuViewContainer.alpha = !self.fadeMenuView ?: 1.0f; self.contentViewContainer.alpha = self.contentViewFadeOutAlpha; self.menuViewContainer.transform = CGAffineTransformIdentity; if (self.scaleBackgroundImageView) self.backgroundImageView.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [self.rightMenuViewController endAppearanceTransition]; if (!self.rightMenuVisible && [self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:didShowMenuViewController:)]) { [self.delegate sideMenu:self didShowMenuViewController:self.rightMenuViewController]; } self.visible = !(self.contentViewContainer.frame.size.width == self.view.bounds.size.width && self.contentViewContainer.frame.size.height == self.view.bounds.size.height && self.contentViewContainer.frame.origin.x == 0 && self.contentViewContainer.frame.origin.y == 0); self.rightMenuVisible = self.visible; [[UIApplication sharedApplication] endIgnoringInteractionEvents]; [self addContentViewControllerMotionEffects]; }]; [self statusBarNeedsAppearanceUpdate]; } - (void)hideViewController:(UIViewController *)viewController { [viewController willMoveToParentViewController:nil]; [viewController.view removeFromSuperview]; [viewController removeFromParentViewController]; } - (void)hideMenuViewControllerAnimated:(BOOL)animated { BOOL rightMenuVisible = self.rightMenuVisible; UIViewController *visibleMenuViewController = rightMenuVisible ? self.rightMenuViewController : self.leftMenuViewController; [visibleMenuViewController beginAppearanceTransition:NO animated:animated]; if ([self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:willHideMenuViewController:)]) { [self.delegate sideMenu:self willHideMenuViewController:rightMenuVisible ? self.rightMenuViewController : self.leftMenuViewController]; } self.visible = NO; self.leftMenuVisible = NO; self.rightMenuVisible = NO; [self.contentButton removeFromSuperview]; __typeof (self) __weak weakSelf = self; void (^animationBlock)(void) = ^{ __typeof (weakSelf) __strong strongSelf = weakSelf; if (!strongSelf) { return; } strongSelf.contentViewContainer.transform = CGAffineTransformIdentity; strongSelf.contentViewContainer.frame = strongSelf.view.bounds; if (strongSelf.scaleMenuView) { strongSelf.menuViewContainer.transform = strongSelf.menuViewControllerTransformation; } strongSelf.menuViewContainer.alpha = !self.fadeMenuView ?: 0; strongSelf.contentViewContainer.alpha = 1; if (strongSelf.scaleBackgroundImageView) { strongSelf.backgroundImageView.transform = CGAffineTransformMakeScale(1.7f, 1.7f); } if (strongSelf.parallaxEnabled) { IF_IOS7_OR_GREATER( for (UIMotionEffect *effect in strongSelf.contentViewContainer.motionEffects) { [strongSelf.contentViewContainer removeMotionEffect:effect]; } ); } }; void (^completionBlock)(void) = ^{ __typeof (weakSelf) __strong strongSelf = weakSelf; if (!strongSelf) { return; } [visibleMenuViewController endAppearanceTransition]; if (!strongSelf.visible && [strongSelf.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [strongSelf.delegate respondsToSelector:@selector(sideMenu:didHideMenuViewController:)]) { [strongSelf.delegate sideMenu:strongSelf didHideMenuViewController:rightMenuVisible ? strongSelf.rightMenuViewController : strongSelf.leftMenuViewController]; } }; if (animated) { [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; [UIView animateWithDuration:self.animationDuration animations:^{ animationBlock(); } completion:^(BOOL finished) { [[UIApplication sharedApplication] endIgnoringInteractionEvents]; completionBlock(); }]; } else { animationBlock(); completionBlock(); } [self statusBarNeedsAppearanceUpdate]; } - (void)addContentButton { if (self.contentButton.superview) return; self.contentButton.autoresizingMask = UIViewAutoresizingNone; self.contentButton.frame = self.contentViewContainer.bounds; self.contentButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.contentViewContainer addSubview:self.contentButton]; } - (void)statusBarNeedsAppearanceUpdate { if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { [UIView animateWithDuration:0.3f animations:^{ [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; }]; } } - (void)updateContentViewShadow { if (self.contentViewShadowEnabled) { CALayer *layer = self.contentViewContainer.layer; UIBezierPath *path = [UIBezierPath bezierPathWithRect:layer.bounds]; layer.shadowPath = path.CGPath; layer.shadowColor = self.contentViewShadowColor.CGColor; layer.shadowOffset = self.contentViewShadowOffset; layer.shadowOpacity = self.contentViewShadowOpacity; layer.shadowRadius = self.contentViewShadowRadius; } } - (void)resetContentViewScale { CGAffineTransform t = self.contentViewContainer.transform; CGFloat scale = sqrt(t.a * t.a + t.c * t.c); CGRect frame = self.contentViewContainer.frame; self.contentViewContainer.transform = CGAffineTransformIdentity; self.contentViewContainer.transform = CGAffineTransformMakeScale(scale, scale); self.contentViewContainer.frame = frame; } #pragma mark - #pragma mark iOS 7 Motion Effects (Private) - (void)addMenuViewControllerMotionEffects { if (self.parallaxEnabled) { IF_IOS7_OR_GREATER( for (UIMotionEffect *effect in self.menuViewContainer.motionEffects) { [self.menuViewContainer removeMotionEffect:effect]; } UIInterpolatingMotionEffect *interpolationHorizontal = [[UIInterpolatingMotionEffect alloc]initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; interpolationHorizontal.minimumRelativeValue = @(self.parallaxMenuMinimumRelativeValue); interpolationHorizontal.maximumRelativeValue = @(self.parallaxMenuMaximumRelativeValue); UIInterpolatingMotionEffect *interpolationVertical = [[UIInterpolatingMotionEffect alloc]initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; interpolationVertical.minimumRelativeValue = @(self.parallaxMenuMinimumRelativeValue); interpolationVertical.maximumRelativeValue = @(self.parallaxMenuMaximumRelativeValue); [self.menuViewContainer addMotionEffect:interpolationHorizontal]; [self.menuViewContainer addMotionEffect:interpolationVertical]; ); } } - (void)addContentViewControllerMotionEffects { if (self.parallaxEnabled) { IF_IOS7_OR_GREATER( for (UIMotionEffect *effect in self.contentViewContainer.motionEffects) { [self.contentViewContainer removeMotionEffect:effect]; } [UIView animateWithDuration:0.2 animations:^{ UIInterpolatingMotionEffect *interpolationHorizontal = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; interpolationHorizontal.minimumRelativeValue = @(self.parallaxContentMinimumRelativeValue); interpolationHorizontal.maximumRelativeValue = @(self.parallaxContentMaximumRelativeValue); UIInterpolatingMotionEffect *interpolationVertical = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; interpolationVertical.minimumRelativeValue = @(self.parallaxContentMinimumRelativeValue); interpolationVertical.maximumRelativeValue = @(self.parallaxContentMaximumRelativeValue); [self.contentViewContainer addMotionEffect:interpolationHorizontal]; [self.contentViewContainer addMotionEffect:interpolationVertical]; }]; ); } } #pragma mark - #pragma mark UIGestureRecognizer Delegate (Private) - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { IF_IOS7_OR_GREATER( if (self.interactivePopGestureRecognizerEnabled && [self.contentViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navigationController = (UINavigationController *)self.contentViewController; if (navigationController.viewControllers.count > 1 && navigationController.interactivePopGestureRecognizer.enabled) { return NO; } } ); if (self.panFromEdge && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && !self.visible) { CGPoint point = [touch locationInView:gestureRecognizer.view]; if (point.x < 20.0 || point.x > self.view.frame.size.width - 20.0) { return YES; } else { return NO; } } return YES; } #pragma mark - #pragma mark Pan gesture recognizer (Private) - (void)panGestureRecognized:(UIPanGestureRecognizer *)recognizer { if ([self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:didRecognizePanGesture:)]) [self.delegate sideMenu:self didRecognizePanGesture:recognizer]; if (!self.panGestureEnabled) { return; } CGPoint point = [recognizer translationInView:self.view]; if (recognizer.state == UIGestureRecognizerStateBegan) { [self updateContentViewShadow]; self.originalPoint = CGPointMake(self.contentViewContainer.center.x - CGRectGetWidth(self.contentViewContainer.bounds) / 2.0, self.contentViewContainer.center.y - CGRectGetHeight(self.contentViewContainer.bounds) / 2.0); self.menuViewContainer.transform = CGAffineTransformIdentity; if (self.scaleBackgroundImageView) { self.backgroundImageView.transform = CGAffineTransformIdentity; self.backgroundImageView.frame = self.view.bounds; } self.menuViewContainer.frame = self.view.bounds; [self addContentButton]; [self.view.window endEditing:YES]; self.didNotifyDelegate = NO; } if (recognizer.state == UIGestureRecognizerStateChanged) { CGFloat delta = 0; if (self.visible) { delta = self.originalPoint.x != 0 ? (point.x + self.originalPoint.x) / self.originalPoint.x : 0; } else { delta = point.x / self.view.frame.size.width; } delta = MIN(fabs(delta), 1.6); CGFloat contentViewScale = self.scaleContentView ? 1 - ((1 - self.contentViewScaleValue) * delta) : 1; CGFloat backgroundViewScale = 1.7f - (0.7f * delta); CGFloat menuViewScale = 1.5f - (0.5f * delta); if (!self.bouncesHorizontally) { contentViewScale = MAX(contentViewScale, self.contentViewScaleValue); backgroundViewScale = MAX(backgroundViewScale, 1.0); menuViewScale = MAX(menuViewScale, 1.0); } self.menuViewContainer.alpha = !self.fadeMenuView ?: delta; self.contentViewContainer.alpha = 1 - (1 - self.contentViewFadeOutAlpha) * delta; if (self.scaleBackgroundImageView) { self.backgroundImageView.transform = CGAffineTransformMakeScale(backgroundViewScale, backgroundViewScale); } if (self.scaleMenuView) { self.menuViewContainer.transform = CGAffineTransformMakeScale(menuViewScale, menuViewScale); } if (self.scaleBackgroundImageView) { if (backgroundViewScale < 1) { self.backgroundImageView.transform = CGAffineTransformIdentity; } } if (!self.bouncesHorizontally && self.visible) { if (self.contentViewContainer.frame.origin.x > self.contentViewContainer.frame.size.width / 2.0) point.x = MIN(0.0, point.x); if (self.contentViewContainer.frame.origin.x < -(self.contentViewContainer.frame.size.width / 2.0)) point.x = MAX(0.0, point.x); } // Limit size // if (point.x < 0) { point.x = MAX(point.x, -[UIScreen mainScreen].bounds.size.height); } else { point.x = MIN(point.x, [UIScreen mainScreen].bounds.size.height); } [recognizer setTranslation:point inView:self.view]; if (!self.didNotifyDelegate) { if (point.x > 0) { if (!self.visible && [self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:willShowMenuViewController:)]) { [self.delegate sideMenu:self willShowMenuViewController:self.leftMenuViewController]; } } if (point.x < 0) { if (!self.visible && [self.delegate conformsToProtocol:@protocol(RESideMenuDelegate)] && [self.delegate respondsToSelector:@selector(sideMenu:willShowMenuViewController:)]) { [self.delegate sideMenu:self willShowMenuViewController:self.rightMenuViewController]; } } self.didNotifyDelegate = YES; } if (contentViewScale > 1) { CGFloat oppositeScale = (1 - (contentViewScale - 1)); self.contentViewContainer.transform = CGAffineTransformMakeScale(oppositeScale, oppositeScale); self.contentViewContainer.transform = CGAffineTransformTranslate(self.contentViewContainer.transform, point.x, 0); } else { self.contentViewContainer.transform = CGAffineTransformMakeScale(contentViewScale, contentViewScale); self.contentViewContainer.transform = CGAffineTransformTranslate(self.contentViewContainer.transform, point.x, 0); } self.leftMenuViewController.view.hidden = self.contentViewContainer.frame.origin.x < 0; self.rightMenuViewController.view.hidden = self.contentViewContainer.frame.origin.x > 0; if (!self.leftMenuViewController && self.contentViewContainer.frame.origin.x > 0) { self.contentViewContainer.transform = CGAffineTransformIdentity; self.contentViewContainer.frame = self.view.bounds; self.visible = NO; self.leftMenuVisible = NO; } else if (!self.rightMenuViewController && self.contentViewContainer.frame.origin.x < 0) { self.contentViewContainer.transform = CGAffineTransformIdentity; self.contentViewContainer.frame = self.view.bounds; self.visible = NO; self.rightMenuVisible = NO; } [self statusBarNeedsAppearanceUpdate]; } if (recognizer.state == UIGestureRecognizerStateEnded) { self.didNotifyDelegate = NO; if (self.panMinimumOpenThreshold > 0 && ( (self.contentViewContainer.frame.origin.x < 0 && self.contentViewContainer.frame.origin.x > -((NSInteger)self.panMinimumOpenThreshold)) || (self.contentViewContainer.frame.origin.x > 0 && self.contentViewContainer.frame.origin.x < self.panMinimumOpenThreshold)) ) { [self hideMenuViewController]; } else if (self.contentViewContainer.frame.origin.x == 0) { [self hideMenuViewControllerAnimated:NO]; } else { if ([recognizer velocityInView:self.view].x > 0) { if (self.contentViewContainer.frame.origin.x < 0) { [self hideMenuViewController]; } else { if (self.leftMenuViewController) { [self showLeftMenuViewController]; } } } else { if (self.contentViewContainer.frame.origin.x < 20) { if (self.rightMenuViewController) { [self showRightMenuViewController]; } } else { [self hideMenuViewController]; } } } } } #pragma mark - #pragma mark Setters - (void)setBackgroundImage:(UIImage *)backgroundImage { _backgroundImage = backgroundImage; if (self.backgroundImageView) self.backgroundImageView.image = backgroundImage; } - (void)setContentViewController:(UIViewController *)contentViewController { if (!_contentViewController) { _contentViewController = contentViewController; return; } [self hideViewController:_contentViewController]; _contentViewController = contentViewController; [self addChildViewController:self.contentViewController]; self.contentViewController.view.frame = self.view.bounds; [self.contentViewContainer addSubview:self.contentViewController.view]; [self.contentViewController didMoveToParentViewController:self]; [self updateContentViewShadow]; if (self.visible) { [self addContentViewControllerMotionEffects]; } } - (void)setLeftMenuViewController:(UIViewController *)leftMenuViewController { if (!_leftMenuViewController) { _leftMenuViewController = leftMenuViewController; return; } [self hideViewController:_leftMenuViewController]; _leftMenuViewController = leftMenuViewController; [self addChildViewController:self.leftMenuViewController]; self.leftMenuViewController.view.frame = self.view.bounds; self.leftMenuViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.menuViewContainer addSubview:self.leftMenuViewController.view]; [self.leftMenuViewController didMoveToParentViewController:self]; [self addMenuViewControllerMotionEffects]; [self.view bringSubviewToFront:self.contentViewContainer]; } - (void)setRightMenuViewController:(UIViewController *)rightMenuViewController { if (!_rightMenuViewController) { _rightMenuViewController = rightMenuViewController; return; } [self hideViewController:_rightMenuViewController]; _rightMenuViewController = rightMenuViewController; [self addChildViewController:self.rightMenuViewController]; self.rightMenuViewController.view.frame = self.view.bounds; self.rightMenuViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.menuViewContainer addSubview:self.rightMenuViewController.view]; [self.rightMenuViewController didMoveToParentViewController:self]; [self addMenuViewControllerMotionEffects]; [self.view bringSubviewToFront:self.contentViewContainer]; } #pragma mark - #pragma mark View Controller Rotation handler - (BOOL)shouldAutorotate { return self.contentViewController.shouldAutorotate; } - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { if (self.visible) { self.menuViewContainer.bounds = self.view.bounds; self.contentViewContainer.transform = CGAffineTransformIdentity; self.contentViewContainer.frame = self.view.bounds; if (self.scaleContentView) { self.contentViewContainer.transform = CGAffineTransformMakeScale(self.contentViewScaleValue, self.contentViewScaleValue); } else { self.contentViewContainer.transform = CGAffineTransformIdentity; } CGPoint center; if (self.leftMenuVisible) { if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) { center = CGPointMake((UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? self.contentViewInLandscapeOffsetCenterX + CGRectGetWidth(self.view.frame) : self.contentViewInPortraitOffsetCenterX + CGRectGetWidth(self.view.frame)), self.contentViewContainer.center.y); } else { center = CGPointMake((UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? self.contentViewInLandscapeOffsetCenterX + CGRectGetHeight(self.view.frame) : self.contentViewInPortraitOffsetCenterX + CGRectGetWidth(self.view.frame)), self.contentViewContainer.center.y); } } else { center = CGPointMake((UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? -self.contentViewInLandscapeOffsetCenterX : -self.contentViewInPortraitOffsetCenterX), self.contentViewContainer.center.y); } self.contentViewContainer.center = center; } [self updateContentViewShadow]; } #pragma mark - #pragma mark Status Bar Appearance Management - (UIStatusBarStyle)preferredStatusBarStyle { UIStatusBarStyle statusBarStyle = UIStatusBarStyleDefault; IF_IOS7_OR_GREATER( statusBarStyle = self.visible ? self.menuPreferredStatusBarStyle : self.contentViewController.preferredStatusBarStyle; if (self.contentViewContainer.frame.origin.y > 10) { statusBarStyle = self.menuPreferredStatusBarStyle; } else { statusBarStyle = self.contentViewController.preferredStatusBarStyle; } ); return statusBarStyle; } - (BOOL)prefersStatusBarHidden { BOOL statusBarHidden = NO; IF_IOS7_OR_GREATER( statusBarHidden = self.visible ? self.menuPrefersStatusBarHidden : self.contentViewController.prefersStatusBarHidden; if (self.contentViewContainer.frame.origin.y > 10) { statusBarHidden = self.menuPrefersStatusBarHidden; } else { statusBarHidden = self.contentViewController.prefersStatusBarHidden; } ); return statusBarHidden; } - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { UIStatusBarAnimation statusBarAnimation = UIStatusBarAnimationNone; IF_IOS7_OR_GREATER( statusBarAnimation = self.visible ? self.leftMenuViewController.preferredStatusBarUpdateAnimation : self.contentViewController.preferredStatusBarUpdateAnimation; if (self.contentViewContainer.frame.origin.y > 10) { statusBarAnimation = self.leftMenuViewController.preferredStatusBarUpdateAnimation; } else { statusBarAnimation = self.contentViewController.preferredStatusBarUpdateAnimation; } ); return statusBarAnimation; } @end ================================================ FILE: RESideMenu/UIViewController+RESideMenu.h ================================================ // // UIViewController+RESideMenu.h // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 @class RESideMenu; @interface UIViewController (RESideMenu) @property (strong, readonly, nonatomic) RESideMenu *sideMenuViewController; // IB Action Helper methods - (IBAction)presentLeftMenuViewController:(id)sender; - (IBAction)presentRightMenuViewController:(id)sender; @end ================================================ FILE: RESideMenu/UIViewController+RESideMenu.m ================================================ // // UIViewController+RESideMenu.m // RESideMenu // // Copyright (c) 2013-2014 Roman Efimov (https://github.com/romaonthego) // // 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 "UIViewController+RESideMenu.h" #import "RESideMenu.h" @implementation UIViewController (RESideMenu) - (RESideMenu *)sideMenuViewController { UIViewController *iter = self.parentViewController; while (iter) { if ([iter isKindOfClass:[RESideMenu class]]) { return (RESideMenu *)iter; } else if (iter.parentViewController && iter.parentViewController != iter) { iter = iter.parentViewController; } else { iter = nil; } } return nil; } #pragma mark - #pragma mark IB Action Helper methods - (IBAction)presentLeftMenuViewController:(id)sender { [self.sideMenuViewController presentLeftMenuViewController]; } - (IBAction)presentRightMenuViewController:(id)sender { [self.sideMenuViewController presentRightMenuViewController]; } @end ================================================ FILE: RESideMenu.podspec ================================================ Pod::Spec.new do |s| s.name = 'RESideMenu' s.version = '4.0.7' s.authors = { 'Roman Efimov' => 'romefimov@gmail.com' } s.homepage = 'https://github.com/romaonthego/RESideMenu' s.summary = 'iOS 7 style side menu with parallax effect.' s.source = { :git => 'https://github.com/romaonthego/RESideMenu.git', :tag => s.version.to_s } s.license = { :type => "MIT", :file => "LICENSE" } s.platform = :ios, '6.0' s.requires_arc = true s.source_files = 'RESideMenu' s.public_header_files = 'RESideMenu/*.h' s.ios.deployment_target = '6.0' s.ios.frameworks = 'QuartzCore' end