├── .gitignore ├── LICENSE ├── RBMenu.podspec ├── RBMenu ├── RBMenu.h └── RBMenu.m ├── RBMenuBarDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── RBMenuBarDemo.xccheckout │ └── xcuserdata │ │ ├── Roshan.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings │ │ └── roshanbalaji.xcuserdatad │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ ├── Roshan.xcuserdatad │ └── xcschemes │ │ ├── RBMenuBarDemo.xcscheme │ │ └── xcschememanagement.plist │ └── roshanbalaji.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── RBMenuBarDemo.xcscheme │ └── xcschememanagement.plist ├── RBMenuBarDemo ├── Base.lproj │ └── Main.storyboard ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── LaunchImage.launchimage │ │ └── Contents.json │ └── menu.imageset │ │ ├── Contents.json │ │ ├── menu-32.png │ │ └── menu-50.png ├── RBMenuBarDemo-Info.plist ├── RBMenuBarDemo-Prefix.pch ├── ULAppDelegate.h ├── ULAppDelegate.m ├── ULFirstViewController.h ├── ULFirstViewController.m ├── ULNavigationController.h ├── ULNavigationController.m ├── ULRootViewController.h ├── ULRootViewController.m ├── ULSecondViewController.h ├── ULSecondViewController.m ├── en.lproj │ └── InfoPlist.strings └── main.m ├── RBMenuBarDemoTests ├── RBMenuBarDemoTests-Info.plist ├── RBMenuBarDemoTests.m └── en.lproj │ └── InfoPlist.strings ├── README.md └── Screen Shot ├── RBMenuDemo.gif ├── RBMenuDemo_custom_black.gif └── Screen_Shot.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2014 Roshan Balaji. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /RBMenu.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = 'RBMenu' 4 | s.version = '0.2.4' 5 | s.license = 'MIT' 6 | s.platform = :ios, '7.0' 7 | 8 | s.summary = 'A Control Menu control that mimics the functionality of Medium iOS app menu.' 9 | s.homepage = 'https://github.com/RoshanNindrai/RBMenu' 10 | s.author = { 'Roshan Balaji' => 'roshan.nindrai@gmail.com'} 11 | s.source = { :git => 'https://github.com/RoshanNindrai/RBMenu.git', :tag => s.version.to_s } 12 | 13 | s.source_files = 'RBMenu/RBMenu.{h,m}' 14 | 15 | s.requires_arc = true 16 | 17 | s.frameworks = 'QuartzCore' 18 | end 19 | -------------------------------------------------------------------------------- /RBMenu/RBMenu.h: -------------------------------------------------------------------------------- 1 | // 2 | // RBMenu.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/28/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef enum { 12 | 13 | RBMenuShownState, 14 | RBMenuClosedState, 15 | RBMenuDisplayingState 16 | 17 | }RBMenuState; 18 | 19 | typedef enum { 20 | 21 | RBMenuTextAlignmentLeft, 22 | RBMenuTextAlignmentRight, 23 | RBMenuTextAlignmentCenter 24 | 25 | }RBMenuAlignment; 26 | 27 | @interface RBMenuItem : NSObject 28 | 29 | 30 | //The title of the menu item 31 | @property(nonatomic, strong)NSString *title; 32 | //completion handler 33 | @property(nonatomic, strong)void (^completion)(BOOL); 34 | 35 | //initialization methods 36 | -(RBMenuItem *)initMenuItemWithTitle:(NSString *)title withCompletionHandler:(void (^)(BOOL))completion; 37 | 38 | @end 39 | 40 | @interface RBMenu : UIView 41 | 42 | @property(nonatomic)RBMenuState currentMenuState; 43 | @property(nonatomic)NSUInteger highLighedIndex; 44 | @property(nonatomic)CGFloat height; 45 | @property(nonatomic, strong)UIColor *textColor; 46 | @property(nonatomic, strong)UIFont *titleFont; 47 | @property(nonatomic, strong)UIColor *highLightTextColor; 48 | @property(nonatomic)RBMenuAlignment titleAlignment; 49 | 50 | //create Menu with white background 51 | -(RBMenu *)initWithItems:(NSArray *)menuItems andTextAlignment:(RBMenuAlignment)titleAlignment forViewController:(UIViewController *)viewController; 52 | 53 | -(RBMenu *)initWithItems:(NSArray *)menuItems 54 | textColor:(UIColor *)textColor 55 | hightLightTextColor:(UIColor *)hightLightTextColor 56 | backgroundColor:(UIColor *)backGroundColor 57 | andTextAlignment:(RBMenuAlignment)titleAlignment 58 | forViewController:(UIViewController *)viewController; 59 | 60 | -(void)showMenu; 61 | 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /RBMenu/RBMenu.m: -------------------------------------------------------------------------------- 1 | // 2 | // RBMenu.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/28/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "RBMenu.h" 10 | #import 11 | 12 | #define CELLIDENTIFIER @"menubutton" 13 | #define MENU_BOUNCE_OFFSET 10 14 | #define PANGESTUREENABLE 1 15 | #define VELOCITY_TRESHOLD 1000 16 | #define AUTOCLOSE_VELOCITY 1200 17 | 18 | @interface RBMenuItem () 19 | 20 | //the menuButton 21 | @property(strong, nonatomic)UIButton *menuButton; 22 | 23 | 24 | @end 25 | 26 | @implementation RBMenuItem 27 | 28 | 29 | -(RBMenuItem *)initMenuItemWithTitle:(NSString *)title 30 | withCompletionHandler:(void (^)(BOOL))completion; 31 | { 32 | 33 | self.title = title; 34 | self.completion = completion; 35 | return self; 36 | 37 | } 38 | 39 | @end 40 | 41 | @interface RBMenu () 42 | 43 | 44 | @property(nonatomic, strong)NSArray *menuItems; 45 | @property(nonatomic, strong)UITableView *menuContentTable; 46 | @property(nonatomic, weak)UIViewController *contentController; 47 | 48 | @end 49 | 50 | @implementation RBMenu 51 | 52 | NSString *const MENU_ITEM_DEFAULT_FONTNAME = @"HelveticaNeue-Light"; 53 | NSInteger const MENU_ITEM_DEFAULT_FONTSIZE = 25; 54 | NSInteger const STARTINDEX = 1; 55 | 56 | - (id)initWithFrame:(CGRect)frame 57 | { 58 | self = [super initWithFrame:frame]; 59 | if (self) { 60 | self.highLighedIndex = STARTINDEX; 61 | self.currentMenuState = RBMenuClosedState; 62 | self.titleFont = [UIFont fontWithName:MENU_ITEM_DEFAULT_FONTNAME size:MENU_ITEM_DEFAULT_FONTSIZE]; 63 | self.height = 260; 64 | } 65 | return self; 66 | } 67 | 68 | #pragma mark initializers 69 | 70 | -(RBMenu *)initWithItems:(NSArray *)menuItems 71 | andTextAlignment:(RBMenuAlignment)titleAlignment 72 | forViewController:(UIViewController *)viewController 73 | { 74 | 75 | return [self initWithItems:menuItems 76 | textColor:[UIColor grayColor] 77 | hightLightTextColor:[UIColor blackColor] 78 | backgroundColor:[UIColor whiteColor] 79 | andTextAlignment:titleAlignment 80 | forViewController:viewController]; 81 | } 82 | 83 | -(RBMenu *)initWithItems:(NSArray *)menuItems 84 | textColor:(UIColor *)textColor 85 | hightLightTextColor:(UIColor *)hightLightTextColor 86 | backgroundColor:(UIColor *)backGroundColor 87 | andTextAlignment:(RBMenuAlignment)titleAlignment 88 | forViewController:(UIViewController *)viewController 89 | { 90 | 91 | self = [[RBMenu alloc] init]; 92 | self.frame = CGRectMake(0, 0, CGRectGetWidth([[UIScreen mainScreen] bounds]), self.height); 93 | self.menuItems = menuItems; 94 | self.titleAlignment = titleAlignment; 95 | self.textColor = textColor; 96 | self.highLightTextColor = hightLightTextColor; 97 | self.backgroundColor = backGroundColor; 98 | self.contentController = viewController; 99 | 100 | return self; 101 | 102 | } 103 | 104 | #pragma mark setter 105 | 106 | -(void)setHeight:(CGFloat)height{ 107 | 108 | if(_height != height){ 109 | 110 | CGRect menuFrame = self.frame; 111 | menuFrame.size.height = height; 112 | _menuContentTable.frame = menuFrame; 113 | _height = height; 114 | } 115 | 116 | 117 | } 118 | 119 | -(void)setContentController:(UIViewController *)contentController{ 120 | 121 | if(_contentController != contentController){ 122 | 123 | if(contentController.navigationController) 124 | _contentController = contentController.navigationController; 125 | else 126 | _contentController = contentController; 127 | 128 | 129 | if(PANGESTUREENABLE) 130 | [_contentController.view addGestureRecognizer:[[UIPanGestureRecognizer alloc] 131 | initWithTarget:self action:@selector(didPan:)]]; 132 | 133 | [self setShadowProperties]; 134 | [_contentController.view setAutoresizingMask:UIViewAutoresizingNone]; 135 | UIViewController *menuController = [[UIViewController alloc] init]; 136 | menuController.view = self; 137 | [[[[UIApplication sharedApplication] delegate] window] setRootViewController:menuController]; 138 | [[[[UIApplication sharedApplication] delegate] window] addSubview:_contentController.view]; 139 | 140 | } 141 | 142 | 143 | } 144 | 145 | -(void)setMenuContentTable:(UITableView *)menuContentTable 146 | { 147 | 148 | if(_menuContentTable != menuContentTable){ 149 | 150 | [menuContentTable setDelegate:self]; 151 | [menuContentTable setDataSource:self]; 152 | [menuContentTable setShowsVerticalScrollIndicator:NO]; 153 | [menuContentTable setSeparatorColor:[UIColor clearColor]]; 154 | [menuContentTable setBackgroundColor:[UIColor whiteColor]]; 155 | [menuContentTable setAllowsMultipleSelection:NO]; 156 | [menuContentTable setBackgroundColor:self.backgroundColor]; 157 | _menuContentTable = menuContentTable; 158 | [self addSubview:_menuContentTable]; 159 | 160 | } 161 | 162 | } 163 | 164 | -(void)setShadowProperties{ 165 | 166 | [_contentController.view.layer setShadowOffset:CGSizeMake(0, 1)]; 167 | [_contentController.view.layer setShadowRadius:4.0]; 168 | [_contentController.view.layer setShadowColor:[UIColor lightGrayColor].CGColor]; 169 | [_contentController.view.layer setShadowOpacity:0.4]; 170 | [_contentController.view.layer setShadowPath:[UIBezierPath 171 | bezierPathWithRect:_contentController.view.bounds].CGPath]; 172 | 173 | } 174 | 175 | #pragma mark layout method 176 | 177 | -(void)layoutSubviews { 178 | 179 | self.currentMenuState = RBMenuClosedState; 180 | self.frame = CGRectMake(0, 0, CGRectGetWidth([[UIScreen mainScreen] bounds]), self.height); 181 | self.contentController.view.frame = CGRectMake(0, 0, CGRectGetWidth([[UIScreen mainScreen] bounds]), CGRectGetHeight([[UIScreen mainScreen] bounds])); 182 | [self setShadowProperties]; 183 | self.menuContentTable = [[UITableView alloc] initWithFrame:self.frame]; 184 | 185 | 186 | } 187 | 188 | 189 | #pragma mark menu interactions 190 | 191 | -(void)showMenu{ 192 | 193 | if(self.currentMenuState == RBMenuShownState || self.currentMenuState == RBMenuDisplayingState){ 194 | if(self.currentMenuState == RBMenuShownState || self.currentMenuState == RBMenuDisplayingState) 195 | [self animateMenuClosingWithCompletion:nil]; 196 | 197 | } 198 | else{ 199 | 200 | self.currentMenuState = RBMenuDisplayingState; 201 | [self animateMenuOpening]; 202 | 203 | } 204 | 205 | } 206 | 207 | -(void)dismissMenu{ 208 | 209 | if(self.currentMenuState == RBMenuShownState || self.currentMenuState == RBMenuDisplayingState){ 210 | 211 | _contentController.view.frame = CGRectOffset(_contentController.view.frame, 0, 212 | - _height + MENU_BOUNCE_OFFSET); 213 | self.currentMenuState = RBMenuClosedState; 214 | 215 | } 216 | 217 | } 218 | 219 | 220 | 221 | -(void)didPan:(UIPanGestureRecognizer *)panRecognizer{ 222 | 223 | __block CGPoint viewCenter = panRecognizer.view.center; 224 | 225 | if(panRecognizer.state == UIGestureRecognizerStateBegan || panRecognizer.state == 226 | UIGestureRecognizerStateChanged){ 227 | CGPoint translation = [panRecognizer translationInView:panRecognizer.view.superview]; 228 | 229 | if(viewCenter.y >= [[UIScreen mainScreen] bounds].size.height / 2 && 230 | viewCenter.y <= (([[UIScreen mainScreen] bounds].size.height / 2 + _height) - MENU_BOUNCE_OFFSET)){ 231 | 232 | self.currentMenuState = RBMenuDisplayingState; 233 | viewCenter.y = ABS(viewCenter.y + translation.y); 234 | 235 | if(viewCenter.y >= [[UIScreen mainScreen] bounds].size.height / 2 && 236 | viewCenter.y < [UIScreen mainScreen].bounds.size.height / 2 + _height - MENU_BOUNCE_OFFSET) 237 | _contentController.view.center = viewCenter; 238 | 239 | [panRecognizer setTranslation:CGPointZero inView:_contentController.view]; 240 | 241 | } 242 | 243 | } 244 | else if(panRecognizer.state == UIGestureRecognizerStateEnded) { 245 | 246 | 247 | CGPoint velocity = [panRecognizer velocityInView:panRecognizer.view.superview]; 248 | if(velocity.y > VELOCITY_TRESHOLD) 249 | [self openMenuFromCenterWithVelocity:velocity.y]; 250 | else if(velocity.y < -VELOCITY_TRESHOLD) 251 | [self closeMenuFromCenterWithVelocity:ABS(velocity.y)]; 252 | else if( viewCenter.y < ([[UIScreen mainScreen] bounds].size.height / 2 + (_height / 2))) 253 | [self closeMenuFromCenterWithVelocity:AUTOCLOSE_VELOCITY]; 254 | else if(viewCenter.y <= ([[UIScreen mainScreen] bounds].size.height / 2 + _height - MENU_BOUNCE_OFFSET)) 255 | [self openMenuFromCenterWithVelocity:AUTOCLOSE_VELOCITY]; 256 | 257 | } 258 | 259 | } 260 | 261 | #pragma mark animation and menu operations 262 | 263 | -(void)animateMenuOpening{ 264 | 265 | if(self.currentMenuState != RBMenuShownState){ 266 | 267 | [UIView animateWithDuration:.2 animations:^{ 268 | 269 | //pushing the content controller down 270 | _contentController.view.center = CGPointMake(_contentController.view.center.x, 271 | [[UIScreen mainScreen] bounds].size.height / 2 + _height); 272 | }completion:^(BOOL finished){ 273 | 274 | [UIView animateWithDuration:.2 animations:^{ 275 | 276 | _contentController.view.center = CGPointMake(_contentController.view.center.x, 277 | [[UIScreen mainScreen] bounds].size.height / 2 + _height - MENU_BOUNCE_OFFSET); 278 | 279 | }completion:^(BOOL finished){ 280 | 281 | self.currentMenuState = RBMenuShownState; 282 | 283 | }]; 284 | 285 | }]; 286 | 287 | } 288 | 289 | 290 | } 291 | 292 | 293 | 294 | -(void)animateMenuClosingWithCompletion:(void (^)(BOOL))completion{ 295 | 296 | [UIView animateWithDuration:.2 animations:^{ 297 | 298 | //pulling the contentController up 299 | _contentController.view.center = CGPointMake(_contentController.view.center.x, 300 | _contentController.view.center.y + MENU_BOUNCE_OFFSET); 301 | 302 | 303 | }completion:^(BOOL finished){ 304 | 305 | [UIView animateWithDuration:.2 animations:^{ 306 | 307 | //pushing the menu controller down 308 | _contentController.view.center = CGPointMake(_contentController.view.center.x, 309 | [[UIScreen mainScreen] bounds].size.height / 2); 310 | 311 | }completion:^(BOOL finished){ 312 | 313 | if(finished){ 314 | self.currentMenuState = RBMenuClosedState; 315 | if(completion) 316 | completion(finished); 317 | } 318 | 319 | }]; 320 | 321 | }]; 322 | 323 | 324 | } 325 | 326 | -(void)closeMenuFromCenterWithVelocity:(CGFloat)velocity{ 327 | 328 | CGFloat viewCenterY = [[UIScreen mainScreen] bounds].size.height / 2; 329 | self.currentMenuState = RBMenuDisplayingState; 330 | [UIView animateWithDuration:((_contentController.view.center.y - viewCenterY) / velocity) animations:^{ 331 | 332 | _contentController.view.center = CGPointMake(_contentController.view.center.x, 333 | [[UIScreen mainScreen] bounds].size.height / 2); 334 | 335 | }completion:^(BOOL completed){ 336 | 337 | self.currentMenuState = RBMenuClosedState; 338 | 339 | }]; 340 | 341 | } 342 | 343 | -(void)openMenuFromCenterWithVelocity:(CGFloat)velocity{ 344 | 345 | 346 | CGFloat viewCenterY = [[UIScreen mainScreen] bounds].size.height / 2 + _height - MENU_BOUNCE_OFFSET; 347 | self.currentMenuState = RBMenuDisplayingState; 348 | [UIView animateWithDuration:((viewCenterY - _contentController.view.center.y) / velocity) animations:^{ 349 | 350 | _contentController.view.center = CGPointMake(_contentController.view.center.x, viewCenterY); 351 | 352 | }completion:^(BOOL completed){ 353 | 354 | self.currentMenuState = RBMenuShownState; 355 | 356 | }]; 357 | 358 | } 359 | 360 | #pragma mark UITableViewDelegates 361 | 362 | -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 363 | 364 | return [self.menuItems count] + 2 * STARTINDEX; 365 | 366 | } 367 | 368 | -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 369 | 370 | UITableViewCell *menuCell = [tableView dequeueReusableCellWithIdentifier:CELLIDENTIFIER]; 371 | RBMenuItem *menuItem; 372 | 373 | if(menuCell == nil) 374 | { 375 | menuCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CELLIDENTIFIER]; 376 | [self setMenuTitleAlligmentForCell:menuCell]; 377 | menuCell.backgroundColor = [UIColor clearColor]; 378 | menuCell.selectionStyle = UITableViewCellSelectionStyleNone; 379 | menuCell.textLabel.textColor = self.textColor; 380 | [menuCell.textLabel setFont:self.titleFont]; 381 | 382 | } 383 | 384 | if(indexPath.row >= STARTINDEX && indexPath.row <= ([self.menuItems count] - 1 + STARTINDEX)) 385 | menuItem = (RBMenuItem *)[self.menuItems objectAtIndex:indexPath.row - STARTINDEX]; 386 | menuCell.textLabel.text = menuItem.title; 387 | 388 | 389 | return menuCell; 390 | 391 | } 392 | 393 | -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 394 | 395 | if(self.highLighedIndex == indexPath.row){ 396 | 397 | cell.textLabel.textColor = _highLightTextColor; 398 | [cell.textLabel setFont:[self.titleFont fontWithSize:self.titleFont.pointSize + 5]]; 399 | 400 | } 401 | else{ 402 | 403 | cell.textLabel.textColor = self.textColor; 404 | [cell.textLabel setFont:self.titleFont]; 405 | 406 | } 407 | 408 | 409 | } 410 | 411 | -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 412 | 413 | 414 | if(indexPath.row < STARTINDEX || indexPath.row > [self.menuItems count] - 1 + STARTINDEX) 415 | return; 416 | 417 | self.highLighedIndex = indexPath.row; 418 | [self.menuContentTable reloadData]; 419 | RBMenuItem *selectedItem = [self.menuItems objectAtIndex:indexPath.row - STARTINDEX]; 420 | [self animateMenuClosingWithCompletion:selectedItem.completion]; 421 | 422 | } 423 | 424 | #pragma mark display modifications 425 | 426 | -(void)setMenuTitleAlligmentForCell:(UITableViewCell *)cell{ 427 | 428 | if (self.titleAlignment) { 429 | 430 | switch (self.titleAlignment) { 431 | 432 | case RBMenuTextAlignmentLeft: 433 | cell.textLabel.textAlignment = NSTextAlignmentLeft; 434 | case RBMenuTextAlignmentCenter: 435 | cell.textLabel.textAlignment = NSTextAlignmentCenter; 436 | break; 437 | case RBMenuTextAlignmentRight: 438 | cell.textLabel.textAlignment = NSTextAlignmentRight; 439 | break; 440 | default: 441 | break; 442 | 443 | } 444 | 445 | } 446 | 447 | } 448 | 449 | @end 450 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6A2C969D194CA55C00012D07 /* RBMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A2C969C194CA55C00012D07 /* RBMenu.m */; }; 11 | 6A2C969E194CA55C00012D07 /* RBMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A2C969C194CA55C00012D07 /* RBMenu.m */; }; 12 | 6A6050401949F79300C1A719 /* ULNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A60503F1949F79300C1A719 /* ULNavigationController.m */; }; 13 | 6A6050411949F79300C1A719 /* ULNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A60503F1949F79300C1A719 /* ULNavigationController.m */; }; 14 | 6A6050441949F8AD00C1A719 /* ULSecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A6050431949F8AD00C1A719 /* ULSecondViewController.m */; }; 15 | 6A6050451949F8AD00C1A719 /* ULSecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A6050431949F8AD00C1A719 /* ULSecondViewController.m */; }; 16 | 6AA3615B18D32E9900ACF474 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3615A18D32E9900ACF474 /* Foundation.framework */; }; 17 | 6AA3615D18D32E9900ACF474 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3615C18D32E9900ACF474 /* CoreGraphics.framework */; }; 18 | 6AA3615F18D32E9900ACF474 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3615E18D32E9900ACF474 /* UIKit.framework */; }; 19 | 6AA3616518D32E9900ACF474 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6AA3616318D32E9900ACF474 /* InfoPlist.strings */; }; 20 | 6AA3616718D32E9900ACF474 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AA3616618D32E9900ACF474 /* main.m */; }; 21 | 6AA3616B18D32E9900ACF474 /* ULAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AA3616A18D32E9900ACF474 /* ULAppDelegate.m */; }; 22 | 6AA3616E18D32E9900ACF474 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6AA3616C18D32E9900ACF474 /* Main.storyboard */; }; 23 | 6AA3617118D32E9900ACF474 /* ULRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AA3617018D32E9900ACF474 /* ULRootViewController.m */; }; 24 | 6AA3617318D32E9900ACF474 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6AA3617218D32E9900ACF474 /* Images.xcassets */; }; 25 | 6AA3617A18D32E9900ACF474 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3617918D32E9900ACF474 /* XCTest.framework */; }; 26 | 6AA3617B18D32E9900ACF474 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3615A18D32E9900ACF474 /* Foundation.framework */; }; 27 | 6AA3617C18D32E9900ACF474 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA3615E18D32E9900ACF474 /* UIKit.framework */; }; 28 | 6AA3618418D32E9900ACF474 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6AA3618218D32E9900ACF474 /* InfoPlist.strings */; }; 29 | 6AA3618618D32E9900ACF474 /* RBMenuBarDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AA3618518D32E9900ACF474 /* RBMenuBarDemoTests.m */; }; 30 | 6AB35782194A0649001CC19E /* ULFirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AB35781194A0649001CC19E /* ULFirstViewController.m */; }; 31 | 6AB35783194A0649001CC19E /* ULFirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AB35781194A0649001CC19E /* ULFirstViewController.m */; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXContainerItemProxy section */ 35 | 6AA3617D18D32E9900ACF474 /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = 6AA3614F18D32E9900ACF474 /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = 6AA3615618D32E9900ACF474; 40 | remoteInfo = RBMenuBarDemo; 41 | }; 42 | /* End PBXContainerItemProxy section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 6A2C969B194CA55C00012D07 /* RBMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RBMenu.h; path = RBMenu/RBMenu.h; sourceTree = SOURCE_ROOT; }; 46 | 6A2C969C194CA55C00012D07 /* RBMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RBMenu.m; path = RBMenu/RBMenu.m; sourceTree = SOURCE_ROOT; }; 47 | 6A60503E1949F79300C1A719 /* ULNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ULNavigationController.h; sourceTree = ""; }; 48 | 6A60503F1949F79300C1A719 /* ULNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ULNavigationController.m; sourceTree = ""; }; 49 | 6A6050421949F8AD00C1A719 /* ULSecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ULSecondViewController.h; sourceTree = ""; }; 50 | 6A6050431949F8AD00C1A719 /* ULSecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ULSecondViewController.m; sourceTree = ""; }; 51 | 6AA3615718D32E9900ACF474 /* RBMenuBarDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RBMenuBarDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 6AA3615A18D32E9900ACF474 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 53 | 6AA3615C18D32E9900ACF474 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 54 | 6AA3615E18D32E9900ACF474 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 55 | 6AA3616218D32E9900ACF474 /* RBMenuBarDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RBMenuBarDemo-Info.plist"; sourceTree = ""; }; 56 | 6AA3616418D32E9900ACF474 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 57 | 6AA3616618D32E9900ACF474 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 58 | 6AA3616818D32E9900ACF474 /* RBMenuBarDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RBMenuBarDemo-Prefix.pch"; sourceTree = ""; }; 59 | 6AA3616918D32E9900ACF474 /* ULAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ULAppDelegate.h; sourceTree = ""; }; 60 | 6AA3616A18D32E9900ACF474 /* ULAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ULAppDelegate.m; sourceTree = ""; }; 61 | 6AA3616D18D32E9900ACF474 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 62 | 6AA3616F18D32E9900ACF474 /* ULRootViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ULRootViewController.h; sourceTree = ""; }; 63 | 6AA3617018D32E9900ACF474 /* ULRootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ULRootViewController.m; sourceTree = ""; }; 64 | 6AA3617218D32E9900ACF474 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 65 | 6AA3617818D32E9900ACF474 /* RBMenuBarDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RBMenuBarDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | 6AA3617918D32E9900ACF474 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 67 | 6AA3618118D32E9900ACF474 /* RBMenuBarDemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RBMenuBarDemoTests-Info.plist"; sourceTree = ""; }; 68 | 6AA3618318D32E9900ACF474 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 69 | 6AA3618518D32E9900ACF474 /* RBMenuBarDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RBMenuBarDemoTests.m; sourceTree = ""; }; 70 | 6AB35780194A0649001CC19E /* ULFirstViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ULFirstViewController.h; sourceTree = ""; }; 71 | 6AB35781194A0649001CC19E /* ULFirstViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ULFirstViewController.m; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | 6AA3615418D32E9900ACF474 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 6AA3615D18D32E9900ACF474 /* CoreGraphics.framework in Frameworks */, 80 | 6AA3615F18D32E9900ACF474 /* UIKit.framework in Frameworks */, 81 | 6AA3615B18D32E9900ACF474 /* Foundation.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | 6AA3617518D32E9900ACF474 /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | 6AA3617A18D32E9900ACF474 /* XCTest.framework in Frameworks */, 90 | 6AA3617C18D32E9900ACF474 /* UIKit.framework in Frameworks */, 91 | 6AA3617B18D32E9900ACF474 /* Foundation.framework in Frameworks */, 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | /* End PBXFrameworksBuildPhase section */ 96 | 97 | /* Begin PBXGroup section */ 98 | 6A07FF68194608B00021F396 /* RBMenu */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 6A2C969B194CA55C00012D07 /* RBMenu.h */, 102 | 6A2C969C194CA55C00012D07 /* RBMenu.m */, 103 | ); 104 | name = RBMenu; 105 | path = RBMenu/RBMenu; 106 | sourceTree = ""; 107 | }; 108 | 6AA3614E18D32E9900ACF474 = { 109 | isa = PBXGroup; 110 | children = ( 111 | 6AA3618F18D32E9F00ACF474 /* RBMenuBar */, 112 | 6AA3616018D32E9900ACF474 /* RBMenuBarDemo */, 113 | 6AA3617F18D32E9900ACF474 /* RBMenuBarDemoTests */, 114 | 6AA3615918D32E9900ACF474 /* Frameworks */, 115 | 6AA3615818D32E9900ACF474 /* Products */, 116 | ); 117 | sourceTree = ""; 118 | }; 119 | 6AA3615818D32E9900ACF474 /* Products */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 6AA3615718D32E9900ACF474 /* RBMenuBarDemo.app */, 123 | 6AA3617818D32E9900ACF474 /* RBMenuBarDemoTests.xctest */, 124 | ); 125 | name = Products; 126 | sourceTree = ""; 127 | }; 128 | 6AA3615918D32E9900ACF474 /* Frameworks */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 6AA3615A18D32E9900ACF474 /* Foundation.framework */, 132 | 6AA3615C18D32E9900ACF474 /* CoreGraphics.framework */, 133 | 6AA3615E18D32E9900ACF474 /* UIKit.framework */, 134 | 6AA3617918D32E9900ACF474 /* XCTest.framework */, 135 | ); 136 | name = Frameworks; 137 | sourceTree = ""; 138 | }; 139 | 6AA3616018D32E9900ACF474 /* RBMenuBarDemo */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 6AA3616918D32E9900ACF474 /* ULAppDelegate.h */, 143 | 6AA3616A18D32E9900ACF474 /* ULAppDelegate.m */, 144 | 6AA3616F18D32E9900ACF474 /* ULRootViewController.h */, 145 | 6AA3617018D32E9900ACF474 /* ULRootViewController.m */, 146 | 6AB35780194A0649001CC19E /* ULFirstViewController.h */, 147 | 6AB35781194A0649001CC19E /* ULFirstViewController.m */, 148 | 6A6050421949F8AD00C1A719 /* ULSecondViewController.h */, 149 | 6A6050431949F8AD00C1A719 /* ULSecondViewController.m */, 150 | 6A60503E1949F79300C1A719 /* ULNavigationController.h */, 151 | 6A60503F1949F79300C1A719 /* ULNavigationController.m */, 152 | 6AA3616C18D32E9900ACF474 /* Main.storyboard */, 153 | 6AA3617218D32E9900ACF474 /* Images.xcassets */, 154 | 6AA3616118D32E9900ACF474 /* Supporting Files */, 155 | ); 156 | path = RBMenuBarDemo; 157 | sourceTree = ""; 158 | }; 159 | 6AA3616118D32E9900ACF474 /* Supporting Files */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 6AA3616218D32E9900ACF474 /* RBMenuBarDemo-Info.plist */, 163 | 6AA3616318D32E9900ACF474 /* InfoPlist.strings */, 164 | 6AA3616618D32E9900ACF474 /* main.m */, 165 | 6AA3616818D32E9900ACF474 /* RBMenuBarDemo-Prefix.pch */, 166 | ); 167 | name = "Supporting Files"; 168 | sourceTree = ""; 169 | }; 170 | 6AA3617F18D32E9900ACF474 /* RBMenuBarDemoTests */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 6AA3618518D32E9900ACF474 /* RBMenuBarDemoTests.m */, 174 | 6AA3618018D32E9900ACF474 /* Supporting Files */, 175 | ); 176 | path = RBMenuBarDemoTests; 177 | sourceTree = ""; 178 | }; 179 | 6AA3618018D32E9900ACF474 /* Supporting Files */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 6AA3618118D32E9900ACF474 /* RBMenuBarDemoTests-Info.plist */, 183 | 6AA3618218D32E9900ACF474 /* InfoPlist.strings */, 184 | ); 185 | name = "Supporting Files"; 186 | sourceTree = ""; 187 | }; 188 | 6AA3618F18D32E9F00ACF474 /* RBMenuBar */ = { 189 | isa = PBXGroup; 190 | children = ( 191 | 6A07FF68194608B00021F396 /* RBMenu */, 192 | ); 193 | name = RBMenuBar; 194 | sourceTree = ""; 195 | }; 196 | /* End PBXGroup section */ 197 | 198 | /* Begin PBXNativeTarget section */ 199 | 6AA3615618D32E9900ACF474 /* RBMenuBarDemo */ = { 200 | isa = PBXNativeTarget; 201 | buildConfigurationList = 6AA3618918D32E9900ACF474 /* Build configuration list for PBXNativeTarget "RBMenuBarDemo" */; 202 | buildPhases = ( 203 | 6AA3615318D32E9900ACF474 /* Sources */, 204 | 6AA3615418D32E9900ACF474 /* Frameworks */, 205 | 6AA3615518D32E9900ACF474 /* Resources */, 206 | ); 207 | buildRules = ( 208 | ); 209 | dependencies = ( 210 | ); 211 | name = RBMenuBarDemo; 212 | productName = RBMenuBarDemo; 213 | productReference = 6AA3615718D32E9900ACF474 /* RBMenuBarDemo.app */; 214 | productType = "com.apple.product-type.application"; 215 | }; 216 | 6AA3617718D32E9900ACF474 /* RBMenuBarDemoTests */ = { 217 | isa = PBXNativeTarget; 218 | buildConfigurationList = 6AA3618C18D32E9900ACF474 /* Build configuration list for PBXNativeTarget "RBMenuBarDemoTests" */; 219 | buildPhases = ( 220 | 6AA3617418D32E9900ACF474 /* Sources */, 221 | 6AA3617518D32E9900ACF474 /* Frameworks */, 222 | 6AA3617618D32E9900ACF474 /* Resources */, 223 | ); 224 | buildRules = ( 225 | ); 226 | dependencies = ( 227 | 6AA3617E18D32E9900ACF474 /* PBXTargetDependency */, 228 | ); 229 | name = RBMenuBarDemoTests; 230 | productName = RBMenuBarDemoTests; 231 | productReference = 6AA3617818D32E9900ACF474 /* RBMenuBarDemoTests.xctest */; 232 | productType = "com.apple.product-type.bundle.unit-test"; 233 | }; 234 | /* End PBXNativeTarget section */ 235 | 236 | /* Begin PBXProject section */ 237 | 6AA3614F18D32E9900ACF474 /* Project object */ = { 238 | isa = PBXProject; 239 | attributes = { 240 | CLASSPREFIX = UL; 241 | LastUpgradeCheck = 0510; 242 | ORGANIZATIONNAME = "Uniq Labs"; 243 | TargetAttributes = { 244 | 6AA3617718D32E9900ACF474 = { 245 | TestTargetID = 6AA3615618D32E9900ACF474; 246 | }; 247 | }; 248 | }; 249 | buildConfigurationList = 6AA3615218D32E9900ACF474 /* Build configuration list for PBXProject "RBMenuBarDemo" */; 250 | compatibilityVersion = "Xcode 3.2"; 251 | developmentRegion = English; 252 | hasScannedForEncodings = 0; 253 | knownRegions = ( 254 | en, 255 | Base, 256 | ); 257 | mainGroup = 6AA3614E18D32E9900ACF474; 258 | productRefGroup = 6AA3615818D32E9900ACF474 /* Products */; 259 | projectDirPath = ""; 260 | projectRoot = ""; 261 | targets = ( 262 | 6AA3615618D32E9900ACF474 /* RBMenuBarDemo */, 263 | 6AA3617718D32E9900ACF474 /* RBMenuBarDemoTests */, 264 | ); 265 | }; 266 | /* End PBXProject section */ 267 | 268 | /* Begin PBXResourcesBuildPhase section */ 269 | 6AA3615518D32E9900ACF474 /* Resources */ = { 270 | isa = PBXResourcesBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | 6AA3617318D32E9900ACF474 /* Images.xcassets in Resources */, 274 | 6AA3616518D32E9900ACF474 /* InfoPlist.strings in Resources */, 275 | 6AA3616E18D32E9900ACF474 /* Main.storyboard in Resources */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | 6AA3617618D32E9900ACF474 /* Resources */ = { 280 | isa = PBXResourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | 6AA3618418D32E9900ACF474 /* InfoPlist.strings in Resources */, 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXResourcesBuildPhase section */ 288 | 289 | /* Begin PBXSourcesBuildPhase section */ 290 | 6AA3615318D32E9900ACF474 /* Sources */ = { 291 | isa = PBXSourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | 6AA3616718D32E9900ACF474 /* main.m in Sources */, 295 | 6A2C969D194CA55C00012D07 /* RBMenu.m in Sources */, 296 | 6AB35782194A0649001CC19E /* ULFirstViewController.m in Sources */, 297 | 6A6050401949F79300C1A719 /* ULNavigationController.m in Sources */, 298 | 6AA3616B18D32E9900ACF474 /* ULAppDelegate.m in Sources */, 299 | 6A6050441949F8AD00C1A719 /* ULSecondViewController.m in Sources */, 300 | 6AA3617118D32E9900ACF474 /* ULRootViewController.m in Sources */, 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | }; 304 | 6AA3617418D32E9900ACF474 /* Sources */ = { 305 | isa = PBXSourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | 6A6050411949F79300C1A719 /* ULNavigationController.m in Sources */, 309 | 6A6050451949F8AD00C1A719 /* ULSecondViewController.m in Sources */, 310 | 6A2C969E194CA55C00012D07 /* RBMenu.m in Sources */, 311 | 6AB35783194A0649001CC19E /* ULFirstViewController.m in Sources */, 312 | 6AA3618618D32E9900ACF474 /* RBMenuBarDemoTests.m in Sources */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | /* End PBXSourcesBuildPhase section */ 317 | 318 | /* Begin PBXTargetDependency section */ 319 | 6AA3617E18D32E9900ACF474 /* PBXTargetDependency */ = { 320 | isa = PBXTargetDependency; 321 | target = 6AA3615618D32E9900ACF474 /* RBMenuBarDemo */; 322 | targetProxy = 6AA3617D18D32E9900ACF474 /* PBXContainerItemProxy */; 323 | }; 324 | /* End PBXTargetDependency section */ 325 | 326 | /* Begin PBXVariantGroup section */ 327 | 6AA3616318D32E9900ACF474 /* InfoPlist.strings */ = { 328 | isa = PBXVariantGroup; 329 | children = ( 330 | 6AA3616418D32E9900ACF474 /* en */, 331 | ); 332 | name = InfoPlist.strings; 333 | sourceTree = ""; 334 | }; 335 | 6AA3616C18D32E9900ACF474 /* Main.storyboard */ = { 336 | isa = PBXVariantGroup; 337 | children = ( 338 | 6AA3616D18D32E9900ACF474 /* Base */, 339 | ); 340 | name = Main.storyboard; 341 | sourceTree = ""; 342 | }; 343 | 6AA3618218D32E9900ACF474 /* InfoPlist.strings */ = { 344 | isa = PBXVariantGroup; 345 | children = ( 346 | 6AA3618318D32E9900ACF474 /* en */, 347 | ); 348 | name = InfoPlist.strings; 349 | sourceTree = ""; 350 | }; 351 | /* End PBXVariantGroup section */ 352 | 353 | /* Begin XCBuildConfiguration section */ 354 | 6AA3618718D32E9900ACF474 /* Debug */ = { 355 | isa = XCBuildConfiguration; 356 | buildSettings = { 357 | ALWAYS_SEARCH_USER_PATHS = NO; 358 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 359 | CLANG_CXX_LIBRARY = "libc++"; 360 | CLANG_ENABLE_MODULES = YES; 361 | CLANG_ENABLE_OBJC_ARC = YES; 362 | CLANG_WARN_BOOL_CONVERSION = YES; 363 | CLANG_WARN_CONSTANT_CONVERSION = YES; 364 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 365 | CLANG_WARN_EMPTY_BODY = YES; 366 | CLANG_WARN_ENUM_CONVERSION = YES; 367 | CLANG_WARN_INT_CONVERSION = YES; 368 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 369 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 370 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 371 | COPY_PHASE_STRIP = NO; 372 | GCC_C_LANGUAGE_STANDARD = gnu99; 373 | GCC_DYNAMIC_NO_PIC = NO; 374 | GCC_OPTIMIZATION_LEVEL = 0; 375 | GCC_PREPROCESSOR_DEFINITIONS = ( 376 | "DEBUG=1", 377 | "$(inherited)", 378 | ); 379 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 380 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 381 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 382 | GCC_WARN_UNDECLARED_SELECTOR = YES; 383 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 384 | GCC_WARN_UNUSED_FUNCTION = YES; 385 | GCC_WARN_UNUSED_VARIABLE = YES; 386 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 387 | ONLY_ACTIVE_ARCH = YES; 388 | SDKROOT = iphoneos; 389 | }; 390 | name = Debug; 391 | }; 392 | 6AA3618818D32E9900ACF474 /* Release */ = { 393 | isa = XCBuildConfiguration; 394 | buildSettings = { 395 | ALWAYS_SEARCH_USER_PATHS = NO; 396 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 397 | CLANG_CXX_LIBRARY = "libc++"; 398 | CLANG_ENABLE_MODULES = YES; 399 | CLANG_ENABLE_OBJC_ARC = YES; 400 | CLANG_WARN_BOOL_CONVERSION = YES; 401 | CLANG_WARN_CONSTANT_CONVERSION = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INT_CONVERSION = YES; 406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 407 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 408 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 409 | COPY_PHASE_STRIP = YES; 410 | ENABLE_NS_ASSERTIONS = NO; 411 | GCC_C_LANGUAGE_STANDARD = gnu99; 412 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 413 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 414 | GCC_WARN_UNDECLARED_SELECTOR = YES; 415 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 416 | GCC_WARN_UNUSED_FUNCTION = YES; 417 | GCC_WARN_UNUSED_VARIABLE = YES; 418 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 419 | SDKROOT = iphoneos; 420 | VALIDATE_PRODUCT = YES; 421 | }; 422 | name = Release; 423 | }; 424 | 6AA3618A18D32E9900ACF474 /* Debug */ = { 425 | isa = XCBuildConfiguration; 426 | buildSettings = { 427 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 428 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 429 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 430 | GCC_PREFIX_HEADER = "RBMenuBarDemo/RBMenuBarDemo-Prefix.pch"; 431 | INFOPLIST_FILE = "RBMenuBarDemo/RBMenuBarDemo-Info.plist"; 432 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 433 | PRODUCT_NAME = "$(TARGET_NAME)"; 434 | WRAPPER_EXTENSION = app; 435 | }; 436 | name = Debug; 437 | }; 438 | 6AA3618B18D32E9900ACF474 /* Release */ = { 439 | isa = XCBuildConfiguration; 440 | buildSettings = { 441 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 442 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 443 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 444 | GCC_PREFIX_HEADER = "RBMenuBarDemo/RBMenuBarDemo-Prefix.pch"; 445 | INFOPLIST_FILE = "RBMenuBarDemo/RBMenuBarDemo-Info.plist"; 446 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 447 | PRODUCT_NAME = "$(TARGET_NAME)"; 448 | WRAPPER_EXTENSION = app; 449 | }; 450 | name = Release; 451 | }; 452 | 6AA3618D18D32E9900ACF474 /* Debug */ = { 453 | isa = XCBuildConfiguration; 454 | buildSettings = { 455 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/RBMenuBarDemo.app/RBMenuBarDemo"; 456 | FRAMEWORK_SEARCH_PATHS = ( 457 | "$(SDKROOT)/Developer/Library/Frameworks", 458 | "$(inherited)", 459 | "$(DEVELOPER_FRAMEWORKS_DIR)", 460 | ); 461 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 462 | GCC_PREFIX_HEADER = "RBMenuBarDemo/RBMenuBarDemo-Prefix.pch"; 463 | GCC_PREPROCESSOR_DEFINITIONS = ( 464 | "DEBUG=1", 465 | "$(inherited)", 466 | ); 467 | INFOPLIST_FILE = "RBMenuBarDemoTests/RBMenuBarDemoTests-Info.plist"; 468 | PRODUCT_NAME = "$(TARGET_NAME)"; 469 | TEST_HOST = "$(BUNDLE_LOADER)"; 470 | WRAPPER_EXTENSION = xctest; 471 | }; 472 | name = Debug; 473 | }; 474 | 6AA3618E18D32E9900ACF474 /* Release */ = { 475 | isa = XCBuildConfiguration; 476 | buildSettings = { 477 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/RBMenuBarDemo.app/RBMenuBarDemo"; 478 | FRAMEWORK_SEARCH_PATHS = ( 479 | "$(SDKROOT)/Developer/Library/Frameworks", 480 | "$(inherited)", 481 | "$(DEVELOPER_FRAMEWORKS_DIR)", 482 | ); 483 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 484 | GCC_PREFIX_HEADER = "RBMenuBarDemo/RBMenuBarDemo-Prefix.pch"; 485 | INFOPLIST_FILE = "RBMenuBarDemoTests/RBMenuBarDemoTests-Info.plist"; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | TEST_HOST = "$(BUNDLE_LOADER)"; 488 | WRAPPER_EXTENSION = xctest; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 6AA3615218D32E9900ACF474 /* Build configuration list for PBXProject "RBMenuBarDemo" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 6AA3618718D32E9900ACF474 /* Debug */, 499 | 6AA3618818D32E9900ACF474 /* Release */, 500 | ); 501 | defaultConfigurationIsVisible = 0; 502 | defaultConfigurationName = Release; 503 | }; 504 | 6AA3618918D32E9900ACF474 /* Build configuration list for PBXNativeTarget "RBMenuBarDemo" */ = { 505 | isa = XCConfigurationList; 506 | buildConfigurations = ( 507 | 6AA3618A18D32E9900ACF474 /* Debug */, 508 | 6AA3618B18D32E9900ACF474 /* Release */, 509 | ); 510 | defaultConfigurationIsVisible = 0; 511 | defaultConfigurationName = Release; 512 | }; 513 | 6AA3618C18D32E9900ACF474 /* Build configuration list for PBXNativeTarget "RBMenuBarDemoTests" */ = { 514 | isa = XCConfigurationList; 515 | buildConfigurations = ( 516 | 6AA3618D18D32E9900ACF474 /* Debug */, 517 | 6AA3618E18D32E9900ACF474 /* Release */, 518 | ); 519 | defaultConfigurationIsVisible = 0; 520 | defaultConfigurationName = Release; 521 | }; 522 | /* End XCConfigurationList section */ 523 | }; 524 | rootObject = 6AA3614F18D32E9900ACF474 /* Project object */; 525 | } 526 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.xcworkspace/xcshareddata/RBMenuBarDemo.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 28C36287-D555-4324-80E9-76503F099F89 9 | IDESourceControlProjectName 10 | RBMenuBarDemo 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 0CEA4D29CBC8FD0698E5FFCCB5355C9B360E1E9E 14 | https://github.com/RoshanNindrai/RBMenu.git 15 | 16 | IDESourceControlProjectPath 17 | RBMenuBarDemo.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 0CEA4D29CBC8FD0698E5FFCCB5355C9B360E1E9E 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/RoshanNindrai/RBMenu.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 0CEA4D29CBC8FD0698E5FFCCB5355C9B360E1E9E 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 0CEA4D29CBC8FD0698E5FFCCB5355C9B360E1E9E 36 | IDESourceControlWCCName 37 | RBMenu 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Roshan.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/RBMenuBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Roshan.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Roshan.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/project.xcworkspace/xcuserdata/roshanbalaji.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/xcuserdata/Roshan.xcuserdatad/xcschemes/RBMenuBarDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/xcuserdata/Roshan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RBMenuBarDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 6AA3615618D32E9900ACF474 16 | 17 | primary 18 | 19 | 20 | 6AA3617718D32E9900ACF474 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/xcuserdata/roshanbalaji.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/xcuserdata/roshanbalaji.xcuserdatad/xcschemes/RBMenuBarDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /RBMenuBarDemo.xcodeproj/xcuserdata/roshanbalaji.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RBMenuBarDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 6AA3615618D32E9900ACF474 16 | 17 | primary 18 | 19 | 20 | 6AA3617718D32E9900ACF474 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RBMenuBarDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /RBMenuBarDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RBMenuBarDemo/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "extent" : "full-screen", 14 | "minimum-system-version" : "7.0", 15 | "subtype" : "retina4", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RBMenuBarDemo/Images.xcassets/menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "menu-32.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "menu-50.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /RBMenuBarDemo/Images.xcassets/menu.imageset/menu-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/RBMenuBarDemo/Images.xcassets/menu.imageset/menu-32.png -------------------------------------------------------------------------------- /RBMenuBarDemo/Images.xcassets/menu.imageset/menu-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/RBMenuBarDemo/Images.xcassets/menu.imageset/menu-50.png -------------------------------------------------------------------------------- /RBMenuBarDemo/RBMenuBarDemo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | Uniq-Labs.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationPortraitUpsideDown 37 | UIInterfaceOrientationLandscapeLeft 38 | UIInterfaceOrientationLandscapeRight 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RBMenuBarDemo/RBMenuBarDemo-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // ULAppDelegate.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ULAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // ULAppDelegate.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "ULAppDelegate.h" 10 | #import "ULNavigationController.h" 11 | #import "ULRootViewController.h" 12 | 13 | @implementation ULAppDelegate 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 16 | { 17 | return YES; 18 | } 19 | 20 | - (void)applicationWillResignActive:(UIApplication *)application 21 | { 22 | // 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. 23 | // 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. 24 | } 25 | 26 | - (void)applicationDidEnterBackground:(UIApplication *)application 27 | { 28 | // 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. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | - (void)applicationWillEnterForeground:(UIApplication *)application 33 | { 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application 38 | { 39 | // 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. 40 | } 41 | 42 | - (void)applicationWillTerminate:(UIApplication *)application 43 | { 44 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULFirstViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ULFirstViewController.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ULRootViewController.h" 11 | 12 | @interface ULFirstViewController : ULRootViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULFirstViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ULFirstViewController.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "ULFirstViewController.h" 10 | 11 | @interface ULFirstViewController () 12 | 13 | @end 14 | 15 | @implementation ULFirstViewController 16 | 17 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 18 | { 19 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 20 | if (self) { 21 | // Custom initialization 22 | } 23 | return self; 24 | } 25 | 26 | - (void)viewDidLoad 27 | { 28 | [super viewDidLoad]; 29 | self.title = @"First"; 30 | // Do any additional setup after loading the view. 31 | } 32 | 33 | - (void)didReceiveMemoryWarning 34 | { 35 | [super didReceiveMemoryWarning]; 36 | // Dispose of any resources that can be recreated. 37 | } 38 | 39 | 40 | 41 | /* 42 | #pragma mark - Navigation 43 | 44 | // In a storyboard-based application, you will often want to do a little preparation before navigation 45 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 46 | { 47 | // Get the new view controller using [segue destinationViewController]. 48 | // Pass the selected object to the new view controller. 49 | } 50 | */ 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULNavigationController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ULNavigationController.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ULNavigationController : UINavigationController 12 | 13 | - (void)showMenu; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULNavigationController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ULNavigationController.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "ULNavigationController.h" 10 | #import "RBMenu.h" 11 | #import "ULFirstViewController.h" 12 | #import "ULSecondViewController.h" 13 | 14 | @interface ULNavigationController () 15 | 16 | @property(nonatomic, strong)RBMenu *menu; 17 | 18 | @end 19 | 20 | @implementation ULNavigationController 21 | 22 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 23 | { 24 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 25 | if (self) { 26 | // Custom initialization 27 | } 28 | return self; 29 | } 30 | 31 | - (void)viewDidLoad 32 | { 33 | [super viewDidLoad]; 34 | UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 35 | //creating the menu items 36 | ULFirstViewController *firstViewController = [storyboard instantiateViewControllerWithIdentifier:@"firstView"]; 37 | [self setViewControllers:@[firstViewController] animated:NO]; 38 | 39 | RBMenuItem *item = [[RBMenuItem alloc]initMenuItemWithTitle:@"First" withCompletionHandler:^(BOOL finished){ 40 | 41 | ULFirstViewController *firstViewController = [storyboard instantiateViewControllerWithIdentifier:@"firstView"]; 42 | [self setViewControllers:@[firstViewController] animated:NO]; 43 | 44 | }]; 45 | RBMenuItem *item2 = [[RBMenuItem alloc]initMenuItemWithTitle:@"Second" withCompletionHandler:^(BOOL finished){ 46 | 47 | ULSecondViewController *secondViewController = [storyboard instantiateViewControllerWithIdentifier:@"secondView"]; 48 | [self setViewControllers:@[secondViewController] animated:NO]; 49 | 50 | 51 | 52 | }]; 53 | 54 | 55 | // Do any additional setup after loading the view, typically from a nib. 56 | _menu = [[RBMenu alloc] initWithItems:@[item, item2] textColor:[UIColor whiteColor] hightLightTextColor:[UIColor blackColor] backgroundColor:[UIColor redColor] andTextAlignment:RBMenuTextAlignmentLeft forViewController:self]; 57 | 58 | 59 | 60 | } 61 | 62 | - (void)didReceiveMemoryWarning 63 | { 64 | [super didReceiveMemoryWarning]; 65 | // Dispose of any resources that can be recreated. 66 | } 67 | 68 | - (void)showMenu{ 69 | 70 | [_menu showMenu]; 71 | 72 | } 73 | 74 | /* 75 | #pragma mark - Navigation 76 | 77 | // In a storyboard-based application, you will often want to do a little preparation before navigation 78 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 79 | { 80 | // Get the new view controller using [segue destinationViewController]. 81 | // Pass the selected object to the new view controller. 82 | } 83 | */ 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULRootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ULViewController.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RBMenu.h" 11 | 12 | 13 | @interface ULRootViewController : UIViewController 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULRootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ULViewController.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "ULRootViewController.h" 10 | 11 | 12 | 13 | @interface ULRootViewController () 14 | 15 | 16 | 17 | @end 18 | 19 | @implementation ULRootViewController 20 | 21 | - (void)viewDidLoad 22 | { 23 | [super viewDidLoad]; 24 | self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu"] style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(showMenu)]; 25 | } 26 | 27 | 28 | - (void)didReceiveMemoryWarning 29 | { 30 | [super didReceiveMemoryWarning]; 31 | // Dispose of any resources that can be recreated. 32 | } 33 | 34 | 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULSecondViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ULRootViewController.h 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ULRootViewController.h" 11 | 12 | @interface ULSecondViewController : ULRootViewController 13 | 14 | 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /RBMenuBarDemo/ULSecondViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ULRootViewController.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 6/12/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import "ULSecondViewController.h" 10 | 11 | 12 | @interface ULSecondViewController () 13 | 14 | @end 15 | 16 | @implementation ULSecondViewController 17 | 18 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 19 | { 20 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 21 | if (self) { 22 | // Custom initialization 23 | } 24 | return self; 25 | } 26 | 27 | - (void)viewDidLoad 28 | { 29 | [super viewDidLoad]; 30 | 31 | 32 | // Do any additional setup after loading the view. 33 | } 34 | 35 | 36 | 37 | - (void)didReceiveMemoryWarning 38 | { 39 | [super didReceiveMemoryWarning]; 40 | // Dispose of any resources that can be recreated. 41 | } 42 | 43 | /* 44 | #pragma mark - Navigation 45 | 46 | // In a storyboard-based application, you will often want to do a little preparation before navigation 47 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 48 | { 49 | // Get the new view controller using [segue destinationViewController]. 50 | // Pass the selected object to the new view controller. 51 | } 52 | */ 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /RBMenuBarDemo/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /RBMenuBarDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RBMenuBarDemo 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "ULAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([ULAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /RBMenuBarDemoTests/RBMenuBarDemoTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | Uniq-Labs.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /RBMenuBarDemoTests/RBMenuBarDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RBMenuBarDemoTests.m 3 | // RBMenuBarDemoTests 4 | // 5 | // Created by Roshan Balaji on 3/14/14. 6 | // Copyright (c) 2014 Uniq Labs. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RBMenuBarDemoTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation RBMenuBarDemoTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /RBMenuBarDemoTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RBMenu 2 | ====== 3 | 4 | A menu for iOS that was inspired by [Medium iOS App](https://itunes.apple.com/us/app/medium/id828256236) 5 | 6 | ![Output gif](https://raw.githubusercontent.com/RoshanNindrai/RBMenu/master/Screen%20Shot/RBMenuDemo.gif) 7 | ![Output gif2](https://raw.githubusercontent.com/RoshanNindrai/RBMenu/master/Screen%20Shot/RBMenuDemo_custom_black.gif) 8 | 9 | 10 | Installation 11 | ====== 12 | 13 | The preferred method of installation is with CocoaPods. Add this line to the podfile 14 | 15 | pod 'RBMenu', '~>0.2.4' 16 | 17 | If you want to install manually, copy the RBMenu .h and .m file to the project director. 18 | 19 | Usage 20 | ====== 21 | 22 | THe RBMenu consict of menu items that is denoted by RBMenuItems. Each item for now holds a title and a completion handler. To create a Menu item 23 | 24 | #import "RBMenu.h" 25 | 26 | create each menu item by creating an object of RBMenuItems class For this demo project the menu items were created by the following snippet. Each element have a completionHandler that gets executed when the user clicks the option. 27 | 28 | RBMenuItem *item = [[RBMenuItem alloc]initMenuItemWithTitle:@"First" withCompletionHandler:^(BOOL finished){ 29 | 30 | NSLog(@"First selected"); 31 | 32 | }]; 33 | RBMenuItem *item2 = [[RBMenuItem alloc]initMenuItemWithTitle:@"Second" withCompletionHandler:^(BOOL finished){ 34 | 35 | NSLog(@"Second selected"); 36 | 37 | }]; 38 | 39 | 40 | Once the item are created it is neccesary to add the items to the RBMenu. The delegate needs to be a subclass of UIViewController 41 | 42 | _menu = [[RBMenu alloc] initWithItems:@[item, item2] andTextAlignment:RBMenuTextAlignmentLeft forViewController:self]; 43 | In the above code, the RBMenuItems are added to the menu and the allignment of the title along the menu is also mentioned while menu creation. Custom menu with user defined properties to the Menu can be performed by using the following method. 44 | 45 | -(RBMenu *)initWithItems:(NSArray *)menuItems 46 | textColor:(UIColor *)textColor 47 | hightLightTextColor:(UIColor *)hightLightTextColor 48 | backgroundColor:(UIColor *)backGroundColor 49 | andTextAlignment:(RBMenuAlignment)titleAlignment 50 | forViewController:(UIViewController *)viewController 51 | 52 | At present RBMenu supports three menu title alignments 53 | 54 | RBMenuTextAlignmentLeft 55 | RBMenuTextAlignmentRight 56 | RBMenuTextAlignmentCenter 57 | 58 | The added demo project would give you additional information. 59 | 60 | Customization 61 | ====== 62 | 63 | These properties of the menu can be customized 64 | 65 | @property(nonatomic)CGFloat height; 66 | @property(nonatomic, strong)UIColor *textColor; 67 | @property(nonatomic, strong)UIFont *titleFont; 68 | @property(nonatomic, strong)UIColor *highLightTextColor; 69 | @property(nonatomic)RBMenuAlignment titleAlignment; 70 | 71 | 72 | 73 | Screenshot 74 | ====== 75 | 76 | ![screenshot](https://raw.githubusercontent.com/RoshanNindrai/RBMenu/master/Screen%20Shot/Screen_Shot.png) 77 | 78 | 79 | 80 | TODO 81 | ====== 82 | 83 | 1. Add Images to Menu 84 | 2. Comment the code :( 85 | 3. ~~Add landscape support~~ 86 | 87 | LICENSE: 88 | ============ 89 | RBMenu is available under The MIT License (MIT) 90 | 91 | Copyright (c) 2014 Roshan Balaji 92 | 93 | Permission is hereby granted, free of charge, to any person obtaining a copy 94 | of this software and associated documentation files (the "Software"), to deal 95 | in the Software without restriction, including without limitation the rights 96 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 97 | copies of the Software, and to permit persons to whom the Software is 98 | furnished to do so, subject to the following conditions: 99 | 100 | The above copyright notice and this permission notice shall be included in 101 | all copies or substantial portions of the Software. 102 | 103 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 104 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 105 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 106 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 107 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 108 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 109 | THE SOFTWARE. 110 | 111 | 112 | -------------------------------------------------------------------------------- /Screen Shot/RBMenuDemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/Screen Shot/RBMenuDemo.gif -------------------------------------------------------------------------------- /Screen Shot/RBMenuDemo_custom_black.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/Screen Shot/RBMenuDemo_custom_black.gif -------------------------------------------------------------------------------- /Screen Shot/Screen_Shot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RoshanNindrai/RBMenu/3e0fe3193e732686a17d21ca9b48b7257264acb9/Screen Shot/Screen_Shot.png --------------------------------------------------------------------------------