From cb31201d9205dbcff751cf3a488bfb6c88820e4e Mon Sep 17 00:00:00 2001 From: levey Date: Thu, 13 Oct 2011 16:56:26 +0800 Subject: [PATCH] Add functions:insert/remove tab and viewcontroller. --- Classes/FirstViewController.m | 45 ------- Classes/LeveyTabBar.h | 8 +- Classes/LeveyTabBar.m | 54 +++++++- Classes/LeveyTabBarController.h | 23 ++-- Classes/LeveyTabBarController.m | 119 ++++++++++++------ Classes/LeveyTabBarDemoAppDelegate.m | 4 +- Classes/SecondViewController.m | 48 ++----- .../contents.xcworkspacedata | 7 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 17275 bytes .../xcdebugger/Breakpoints.xcbkptlist | 5 + .../xcschemes/LeveyTabBarDemo.xcscheme | 94 ++++++++++++++ .../xcschemes/xcschememanagement.plist | 22 ++++ tabbarbg.png | Bin 2936 -> 3113 bytes 13 files changed, 284 insertions(+), 145 deletions(-) create mode 100644 LeveyTabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 LeveyTabBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Levey.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/LeveyTabBarDemo.xcscheme create mode 100644 LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Classes/FirstViewController.m b/Classes/FirstViewController.m index 2c4300b..3ed392e 100644 --- a/Classes/FirstViewController.m +++ b/Classes/FirstViewController.m @@ -12,23 +12,6 @@ @implementation FirstViewController -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization. - } - return self; -} -*/ - -/* -// Implement loadView to create a view hierarchy programmatically, without using a nib. -- (void)loadView { -} -*/ - - (void)viewDidLoad { [super viewDidLoad]; @@ -36,32 +19,4 @@ - (void)viewDidLoad } - -/* -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} -*/ - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc. that aren't in use. -} - -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - -- (void)dealloc { - [super dealloc]; -} - - @end diff --git a/Classes/LeveyTabBar.h b/Classes/LeveyTabBar.h index 73a736c..891453c 100644 --- a/Classes/LeveyTabBar.h +++ b/Classes/LeveyTabBar.h @@ -14,18 +14,18 @@ { UIImageView *_backgroundView; id _delegate; - UIButton *_selectedButton; NSMutableArray *_buttons; } @property (nonatomic, retain) UIImageView *backgroundView; -@property (nonatomic, retain) UIImage *backgroundImage; @property (nonatomic, assign) id delegate; -@property (nonatomic, assign) UIButton *selectedButton; @property (nonatomic, retain) NSMutableArray *buttons; - (id)initWithFrame:(CGRect)frame buttonImages:(NSArray *)imageArray; -- (void)selectTabInIndex:(NSInteger)index; +- (void)selectTabAtIndex:(NSInteger)index; +- (void)removeTabAtIndex:(NSInteger)index; +- (void)insertTabWithImageDic:(NSDictionary *)dict atIndex:(NSUInteger)index; + @end @protocol LeveyTabBarDelegate @optional diff --git a/Classes/LeveyTabBar.m b/Classes/LeveyTabBar.m index f9b81b9..01a90a1 100644 --- a/Classes/LeveyTabBar.m +++ b/Classes/LeveyTabBar.m @@ -11,7 +11,6 @@ @implementation LeveyTabBar @synthesize backgroundView = _backgroundView; @synthesize delegate = _delegate; -@synthesize selectedButton = _selectedButton; @synthesize buttons = _buttons; - (id)initWithFrame:(CGRect)frame buttonImages:(NSArray *)imageArray @@ -51,11 +50,15 @@ - (void)setBackgroundImage:(UIImage *)img - (void)tabBarButtonClicked:(id)sender { UIButton *btn = sender; - [self selectTabInIndex:btn.tag]; - [_delegate tabBar:self didSelectIndex:btn.tag]; + [self selectTabAtIndex:btn.tag]; + NSLog(@"Select index: %d",btn.tag); + if ([_delegate respondsToSelector:@selector(tabBar:didSelectIndex:)]) + { + [_delegate tabBar:self didSelectIndex:btn.tag]; + } } -- (void)selectTabInIndex:(NSInteger)index +- (void)selectTabAtIndex:(NSInteger)index { for (int i = 0; i < [self.buttons count]; i++) { @@ -68,8 +71,51 @@ - (void)selectTabInIndex:(NSInteger)index btn.userInteractionEnabled = NO; } +- (void)removeTabAtIndex:(NSInteger)index +{ + // Remove button + [(UIButton *)[self.buttons objectAtIndex:index] removeFromSuperview]; + [self.buttons removeObjectAtIndex:index]; + + // Re-index the buttons + CGFloat width = 320.0f / [self.buttons count]; + for (UIButton *btn in self.buttons) + { + if (btn.tag > index) + { + btn.tag --; + } + btn.frame = CGRectMake(width * btn.tag, 0, width, self.frame.size.height); + } +} +- (void)insertTabWithImageDic:(NSDictionary *)dict atIndex:(NSUInteger)index +{ + // Re-index the buttons + CGFloat width = 320.0f / ([self.buttons count] + 1); + for (UIButton *b in self.buttons) + { + if (b.tag >= index) + { + b.tag ++; + } + b.frame = CGRectMake(width * b.tag, 0, width, self.frame.size.height); + } + UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; + btn.showsTouchWhenHighlighted = YES; + btn.tag = index; + btn.frame = CGRectMake(width * index, 0, width, self.frame.size.height); + [btn setImage:[dict objectForKey:@"Default"] forState:UIControlStateNormal]; + [btn setImage:[dict objectForKey:@"Highlighted"] forState:UIControlStateHighlighted]; + [btn setImage:[dict objectForKey:@"Seleted"] forState:UIControlStateSelected]; + [btn addTarget:self action:@selector(tabBarButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; + [self.buttons insertObject:btn atIndex:index]; + [self addSubview:btn]; +} + - (void)dealloc { + [_backgroundView release]; + [_buttons release]; [super dealloc]; } diff --git a/Classes/LeveyTabBarController.h b/Classes/LeveyTabBarController.h index 9560e62..ad57fcf 100644 --- a/Classes/LeveyTabBarController.h +++ b/Classes/LeveyTabBarController.h @@ -17,32 +17,36 @@ UIView *_transitionView; id _delegate; NSMutableArray *_viewControllers; - - UIViewController *_selectedViewController; - NSArray *_imageArray; + NSUInteger _selectedIndex; BOOL _tabBarTransparent; BOOL _tabBarHidden; } -@property(nonatomic, copy) NSArray *viewControllers; -- (void)setViewControllers:(NSArray *)viewControllers; +@property(nonatomic, copy) NSMutableArray *viewControllers; -@property(nonatomic, assign) UIViewController *selectedViewController; +@property(nonatomic, readonly) UIViewController *selectedViewController; @property(nonatomic) NSUInteger selectedIndex; -//Apple is readonly +// Apple is readonly @property (nonatomic, readonly) LeveyTabBar *tabBar; @property(nonatomic,assign) id delegate; -@property (nonatomic, copy) NSArray *imageArray; -//default is NO, if set to YES, content will under tabbar + +// Default is NO, if set to YES, content will under tabbar @property (nonatomic) BOOL tabBarTransparent; @property (nonatomic) BOOL tabBarHidden; - (id)initWithViewControllers:(NSArray *)vcs imageArray:(NSArray *)arr; - (void)hidesTabBar:(BOOL)yesOrNO animated:(BOOL)animated; + +// Remove the viewcontroller at index of viewControllers. +- (void)removeViewControllerAtIndex:(NSUInteger)index; + +// Insert an viewcontroller at index of viewControllers. +- (void)insertViewController:(UIViewController *)vc withImageDic:(NSDictionary *)dict atIndex:(NSUInteger)index; + @end @@ -54,6 +58,5 @@ @interface UIViewController (LeveyTabBarControllerSupport) @property(nonatomic, retain) LeveyTabBarController *leveyTabBarController; -//- (void)setLeveyTabBarController:(LeveyTabBarController *)tabbar; @end diff --git a/Classes/LeveyTabBarController.m b/Classes/LeveyTabBarController.m index 7f4eae0..f0ded92 100644 --- a/Classes/LeveyTabBarController.m +++ b/Classes/LeveyTabBarController.m @@ -21,13 +21,15 @@ - (LeveyTabBarController *)leveyTabBarController @end +@interface LeveyTabBarController (private) +- (void)displayViewAtIndex:(NSUInteger)index; +@end @implementation LeveyTabBarController -//@synthesize tabBar = _tabBar; @synthesize delegate = _delegate; @synthesize selectedViewController = _selectedViewController; @synthesize viewControllers = _viewControllers; -@synthesize imageArray = _imageArray; +@synthesize selectedIndex = _selectedIndex; @synthesize tabBarHidden = _tabBarHidden; #pragma mark - @@ -37,24 +39,17 @@ - (id)initWithViewControllers:(NSArray *)vcs imageArray:(NSArray *)arr; self = [super init]; if (self != nil) { - self.viewControllers = vcs; - self.imageArray = arr; + _viewControllers = [[NSMutableArray arrayWithArray:vcs] retain]; _containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; _transitionView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320.0f, _containerView.frame.size.height - kTabBarHeight)]; _transitionView.backgroundColor = [UIColor groupTableViewBackgroundColor]; - _tabBar = [[LeveyTabBar alloc] initWithFrame:CGRectMake(0, _containerView.frame.size.height - kTabBarHeight, 320.0f, kTabBarHeight) buttonImages:self.imageArray]; + _tabBar = [[LeveyTabBar alloc] initWithFrame:CGRectMake(0, _containerView.frame.size.height - kTabBarHeight, 320.0f, kTabBarHeight) buttonImages:arr]; _tabBar.delegate = self; - for (UIViewController *vc in vcs) - { - leveyTabBarController = self; - //vc.tabBarController = self; - - //TODO: HERE! - } + leveyTabBarController = self; } return self; } @@ -64,45 +59,36 @@ - (void)loadView [super loadView]; [_containerView addSubview:_transitionView]; - [_transitionView release]; - [_containerView addSubview:_tabBar]; - [_tabBar release]; - //for (UIViewController *vc in self.viewControllers) -// { -// vc.view.frame = _transitionView.bounds; -// } - self.view = _containerView; - //[firstView release]; - } - (void)viewDidLoad { [super viewDidLoad]; - self.selectedIndex = 0; + + self.selectedIndex = 0; } - (void)viewDidUnload { [super viewDidUnload]; _tabBar = nil; - _delegate = nil; - _selectedViewController = nil; _viewControllers = nil; } - (void)dealloc { + _tabBar.delegate = nil; [_tabBar release]; - [_delegate release]; - [_selectedViewController release]; + [_containerView release]; + [_transitionView release]; [_viewControllers release]; [super dealloc]; } -#pragma mark - -#pragma mark methods + +#pragma mark - instant methods + - (LeveyTabBar *)tabBar { return _tabBar; @@ -169,32 +155,83 @@ - (void)hidesTabBar:(BOOL)yesOrNO animated:(BOOL)animated; - (NSUInteger)selectedIndex { - return [self.viewControllers indexOfObject:self.selectedViewController]; + return _selectedIndex; +} +- (UIViewController *)selectedViewController +{ + return [_viewControllers objectAtIndex:_selectedIndex]; } -(void)setSelectedIndex:(NSUInteger)index { - self.selectedViewController = nil; - self.selectedViewController = [self.viewControllers objectAtIndex:index]; - NSLog(@"%@",[self.selectedViewController class]); + [self displayViewAtIndex:index]; + [_tabBar selectTabAtIndex:index]; +} + +- (void)removeViewControllerAtIndex:(NSUInteger)index +{ + if (index >= [_viewControllers count]) + { + return; + } + // Remove view from superview. + [[(UIViewController *)[_viewControllers objectAtIndex:index] view] removeFromSuperview]; + // Remove viewcontroller in array. + [_viewControllers removeObjectAtIndex:index]; + // Remove tab from tabbar. + [_tabBar removeTabAtIndex:index]; +} + +- (void)insertViewController:(UIViewController *)vc withImageDic:(NSDictionary *)dict atIndex:(NSUInteger)index +{ + [_viewControllers insertObject:vc atIndex:index]; + [_tabBar insertTabWithImageDic:dict atIndex:index]; +} + + +#pragma mark - Private methods +- (void)displayViewAtIndex:(NSUInteger)index +{ + // Before change index, ask the delegate should change the index. + if ([_delegate respondsToSelector:@selector(tabBarController:shouldSelectViewController:)]) + { + if (![_delegate tabBarController:self shouldSelectViewController:[self.viewControllers objectAtIndex:index]]) + { + return; + } + } + // If target index if equal to current index, do nothing. + if (_selectedIndex == index && [[_transitionView subviews] count] != 0) + { + return; + } + NSLog(@"Display View."); + _selectedIndex = index; + + UIViewController *selectedVC = [self.viewControllers objectAtIndex:index]; - self.selectedViewController.view.frame = _transitionView.frame; - if ([self.selectedViewController.view isDescendantOfView:_transitionView]) + selectedVC.view.frame = _transitionView.frame; + if ([selectedVC.view isDescendantOfView:_transitionView]) { - [_transitionView bringSubviewToFront:self.selectedViewController.view]; + [_transitionView bringSubviewToFront:selectedVC.view]; } else { - [_transitionView addSubview:self.selectedViewController.view]; + [_transitionView addSubview:selectedVC.view]; } - [_tabBar selectTabInIndex:index]; - + + // Notify the delegate, the viewcontroller has been changed. + if ([_delegate respondsToSelector:@selector(tabBarController:didSelectViewController::)]) + { + [_delegate tabBarController:self didSelectViewController:selectedVC]; + } + } + #pragma mark - #pragma mark tabBar delegates - (void)tabBar:(LeveyTabBar *)tabBar didSelectIndex:(NSInteger)index { - [self setSelectedIndex:index]; - NSLog(@"change to index:%d",index); + [self displayViewAtIndex:index]; } @end diff --git a/Classes/LeveyTabBarDemoAppDelegate.m b/Classes/LeveyTabBarDemoAppDelegate.m index e2dd3f0..e78c0ec 100644 --- a/Classes/LeveyTabBarDemoAppDelegate.m +++ b/Classes/LeveyTabBarDemoAppDelegate.m @@ -32,7 +32,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:secondVC]; nc.delegate = self; [secondVC release]; - NSArray *arr = [NSArray arrayWithObjects:firstVC,nc,thirdVC,fourthVC,fifthVC,nil]; + NSArray *ctrlArr = [NSArray arrayWithObjects:firstVC,nc,thirdVC,fourthVC,fifthVC,nil]; [firstVC release]; [nc release]; [thirdVC release]; @@ -62,7 +62,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSArray *imgArr = [NSArray arrayWithObjects:imgDic,imgDic2,imgDic3,imgDic4,imgDic5,nil]; - leveyTabBarController = [[LeveyTabBarController alloc] initWithViewControllers:arr imageArray:imgArr]; + leveyTabBarController = [[LeveyTabBarController alloc] initWithViewControllers:ctrlArr imageArray:imgArr]; [leveyTabBarController.tabBar setBackgroundImage:[UIImage imageNamed:@"tabbarbg.png"]]; [leveyTabBarController setTabBarTransparent:YES]; [self.window addSubview:leveyTabBarController.view]; diff --git a/Classes/SecondViewController.m b/Classes/SecondViewController.m index 9b1755b..63caa8f 100644 --- a/Classes/SecondViewController.m +++ b/Classes/SecondViewController.m @@ -12,22 +12,6 @@ @implementation SecondViewController -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization. - } - return self; -} -*/ - -/* -// Implement loadView to create a view hierarchy programmatically, without using a nib. -- (void)loadView { -} -*/ - (void)viewWillAppear:(BOOL)animated { @@ -48,34 +32,20 @@ - (void)viewDidLoad - (void)hide { - [self.leveyTabBarController hidesTabBar:YES animated:YES]; +// [self.leveyTabBarController hidesTabBar:YES animated:YES]; +// [self.leveyTabBarController removeViewControllerAtIndex:3]; + NSMutableDictionary *imgDic5 = [NSMutableDictionary dictionaryWithCapacity:3]; + [imgDic5 setObject:[UIImage imageNamed:@"1.png"] forKey:@"Default"]; + [imgDic5 setObject:[UIImage imageNamed:@"2.png"] forKey:@"Highlighted"]; + [imgDic5 setObject:[UIImage imageNamed:@"2.png"] forKey:@"Seleted"]; + FirstViewController *firstVC = [[FirstViewController alloc] init]; - [self.navigationController pushViewController:firstVC animated:YES]; +// [self.navigationController pushViewController:firstVC animated:YES]; + [self.leveyTabBarController insertViewController:firstVC withImageDic:imgDic5 atIndex:2]; [firstVC release]; } -/* -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} -*/ - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc. that aren't in use. -} - -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - (void)dealloc { [super dealloc]; diff --git a/LeveyTabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/LeveyTabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fb601ff --- /dev/null +++ b/LeveyTabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/LeveyTabBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Levey.xcuserdatad/UserInterfaceState.xcuserstate b/LeveyTabBarDemo.xcodeproj/project.xcworkspace/xcuserdata/Levey.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7956cad87a0edd067d02b78cf7c96cbfd462a113 GIT binary patch literal 17275 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 + + diff --git a/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/LeveyTabBarDemo.xcscheme b/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/LeveyTabBarDemo.xcscheme new file mode 100644 index 0000000..928da46 --- /dev/null +++ b/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/LeveyTabBarDemo.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/xcschememanagement.plist b/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..fb8adea --- /dev/null +++ b/LeveyTabBarDemo.xcodeproj/xcuserdata/Levey.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + LeveyTabBarDemo.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 1D6058900D05DD3D006BFB54 + + primary + + + + + diff --git a/tabbarbg.png b/tabbarbg.png index d675299a6a578dd20a67af68f71599efe84bce63..2992c04686077c0df33c33fbb2597c5062ae750c 100644 GIT binary patch delta 372 zcmew%wo+oley)1P5KkA!kcwMxZtnFu9Kg`_aQ#v~y;-iiIy{~!iRe4-5_7St&OIl| z68=$&MPI>UN6BfuEqbytLiJ|0wet+;yp)dPQ(yeHOuC`g#Eem)fuTC>)7{2Zna4f# zCY_n=GkFe|`Um&iNqbZy)hqozU0VC1uXI&WV!zfR=9s?7D1b>6UvJlPn1_4|DLp6W;CnspA1V!QW! zW#5o>%X5;nHDhbkJFDx}%yZON=CFvoO1ZxC9>cje%p!SaA_t6bGqkR5XR1h%UQlq{ znbBqoZ@`X&^A#AXof#MzSp;$%7=R>21d8TUpBWh#{{LrY@PDp9+gi*givb8cUHx3v IIVCg!0Gxn@hX4Qo delta 194 zcmZ1}@k4CGey)0k#hxyXAr-gYTrp&1FyJ__!H~JwUa;a2x7H31l`k24*3>hI?Gj>O y<49Rl2AY;tkC$VT%HUD28RFtnHgGFF!jm(*{~kSW$<+Mb6Mw<&;$Sk;xHKi