实现页面效果如下 :
点击子标签切换对应的页面.
第一天(搭建项目框架)
1.创建项目,设置相关的信息(图标....)
2.使用Storyboard搭建三级控制器框架
子类化导航控制器,子类化Button
3.自定义标签栏(移除系统TabBarButton,使用自定义的WXTabBarButton)
4.设置导航栏
代码如下:
1>
BaseNavigationController类 :
1 #import "BaseNavigationController.h" 2 3 @interface BaseNavigationController () 4 5 @end 6 7 @implementation BaseNavigationController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 12 //设置导航栏背景图片 13 [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bg_all-64"] 14 forBarMetrics:UIBarMetricsDefault]; 15 16 //设置是不起效果的 17 // self.navigationBar.tintColor = [UIColor whiteColor]; 18 // self.navigationBar.barTintColor = [UIColor whiteColor]; 19 // 20 21 //设置导航栏的样式,黑色,则标题是白色的 22 self.navigationBar.barStyle = UIBarStyleBlack; 23 24 25 } 26 27 28 //设置状态栏的样式 状态栏的字是白色的 29 - (UIStatusBarStyle)preferredStatusBarStyle 30 { 31 return UIStatusBarStyleLightContent; 32 33 }
2>
WXTabBarButton类 :
1 #import "WXTabBarButton.h" 2 3 @interface WXTabBarButton () 4 5 @property (nonatomic,strong)UIImageView *imageView; 6 @property (nonatomic,strong)UILabel *titleLabel; 7 8 @end 9 10 11 @implementation WXTabBarButton 12 13 - (instancetype)initWithFrame:(CGRect)frame 14 WithImageName:(NSString *)imageName 15 WithTitle:(NSString *)title{ 16 17 self = [super initWithFrame:frame]; 18 if (self) { 19 20 //1.创建标签栏图片视图 21 _imageView = [[UIImageView alloc]initWithFrame:CGRectMake((frame.size.width - 20) / 2, 7, 20, 20)]; 22 _imageView.image = [UIImage imageNamed:imageName]; 23 _imageView.contentMode = UIViewContentModeScaleAspectFit; 24 _imageView.userInteractionEnabled = YES; 25 26 27 [self addSubview:_imageView]; 28 29 30 //2.创建标签栏标题 31 _titleLabel = [[UILabel alloc] 32 initWithFrame:CGRectMake(0, 7 + 20 + 5, frame.size.width, 17)]; 33 _titleLabel.textAlignment = NSTextAlignmentCenter; 34 _titleLabel.font = [UIFont boldSystemFontOfSize:14]; 35 _titleLabel.textColor = [UIColor whiteColor]; 36 37 _titleLabel.text = title; 38 39 [self addSubview:_titleLabel]; 40 } 41 42 return self; 43 44 }
3>
MainTabBarController类:
1 #import "MainTabBarController.h" 2 3 //导入文件 4 #import "Common.h" 5 #import "WXTabBarButton.h" 6 7 8 @interface MainTabBarController () 9 10 @property (nonatomic,strong)UIImageView *selectedView; 11 12 @end 13 14 @implementation MainTabBarController 15 16 - (void)viewDidLoad { 17 [super viewDidLoad]; 18 19 20 21 //设置导航栏 22 [self _customNavigationBar]; 23 24 //移除按钮 25 [self _removeTabBarButton]; 26 27 //自定义标签栏 28 [self _customTabBar]; 29 30 } 31 32 //视图将要出现的时候调用 33 - (void)viewWillAppear:(BOOL)animated { 34 [super viewWillAppear:animated]; 35 36 //视图将要出现的时候,移除tabbar上的按钮 37 38 //使用storyboard搭建三级控制器,在viewDidLoad方法走完之后,故事板没有全部加载完成 39 //等故事板加载完成,就会再次添加tabbarbutton 40 [self _removeTabBarButton]; 41 } 42 43 44 - (void)didReceiveMemoryWarning { 45 [super didReceiveMemoryWarning]; 46 // Dispose of any resources that can be recreated. 47 } 48 49 50 51 #pragma mark - 标签栏的设置 52 53 //自定义标签栏 54 - (void)_customTabBar{ 55 56 //1.设置标签栏的背景图片 57 58 self.tabBar.backgroundImage = [UIImage imageNamed:@"tab_bg_all"]; 59 60 // 2.选中的视图 61 _selectedView = [[UIImageView alloc] 62 initWithImage:[UIImage imageNamed:@"selectTabbar_bg_all1"]]; 63 _selectedView.frame = CGRectMake(0, 0, 55, 47); 64 [self.tabBar addSubview:_selectedView]; 65 66 //3.设置TabBar按钮 67 68 //先将数据存起来至数组 69 NSArray *titles = @[ @"首页", @"新闻", @"Top", @"影院", @"更多" ]; 70 71 NSArray *imageNames = @[ 72 @"movie_home", 73 @"msg_new", 74 @"start_top250", 75 @"icon_cinema", 76 @"more_setting" 77 ]; 78 79 float buttonWidth = kScreenWidth/titles.count; 80 81 for (NSInteger i = 0; i < titles.count; i++) { 82 83 //取得标题和图片 84 NSString *title = titles[i]; 85 NSString *imageName = imageNames[i]; 86 87 //设置每个按钮的fram 88 CGRect fram = CGRectMake(buttonWidth * i, 0, buttonWidth, kTabBarHeight); 89 90 //使用自定义的控件创建按钮 91 WXTabBarButton *button = [[WXTabBarButton alloc]initWithFrame:fram WithImageName:imageName WithTitle:title]; 92 93 button.tag = 1000 + i; 94 95 [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; 96 [self.tabBar addSubview:button]; 97 98 if (i == 0) { 99 100 //选中的视图和第一个按钮对齐 101 _selectedView.center = button.center; 102 103 } 104 105 } 106 } 107 108 109 //移除系统标签栏上的按钮 110 - (void)_removeTabBarButton { 111 112 //取到所有的子视图 113 for (UIView *view in self.tabBar.subviews) { 114 //从字符串生成一个类名 115 Class class = NSClassFromString(@"UITabBarButton"); 116 117 //找出UITabBarButton,移除掉 118 if ([view isKindOfClass:class]) { 119 [view removeFromSuperview]; 120 } 121 } 122 123 // NSLog(@"%@", self.tabBar.subviews); 124 } 125 126 127 #pragma mark - Button Action 128 - (void)buttonAction:(UIButton *)sender { 129 130 //1.切换控制器 131 self.selectedIndex = sender.tag - 1000; 132 133 134 135 //3.设置动画 136 [UIView beginAnimations:nil context:nil]; 137 [UIView setAnimationDuration:.35]; 138 139 //2.移动选中的视图 140 _selectedView.center = sender.center; 141 142 [UIView commitAnimations]; 143 144 } 145 146 147 148 #pragma mark - 设置导航栏 149 - (void)_customNavigationBar { 150 151 /* 152 for (UINavigationController *naviCtrl in self.viewControllers) { 153 [naviCtrl.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bg_all-64"] forBarMetrics:UIBarMetricsDefault]; 154 } 155 */ 156 157 //Appearance 作用: 158 //实现UIAppearance这个协议方法的系统控件,可以使用它来修改它的默认的样式 159 //只有这行代码执行之后,后面创建控件才会受到影响 160 [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg_all-64"] forBarMetrics:UIBarMetricsDefault]; 161 162 }
原文:http://www.cnblogs.com/pengsi/p/4862039.html