A.搭建基本环境
项目结构:
1.使用代码构建UI,不使用storyboard
AppDelegate:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customization after application launch. 3 4 // 启动后显示状态栏 5 UIApplication *app = [UIApplication sharedApplication]; 6 app.statusBarHidden = NO; 7 8 // 设置window 9 self.window = [[UIWindow alloc] init]; 10 self.window.frame = [UIScreen mainScreen].bounds; 11 12 [self.window makeKeyAndVisible]; 13 14 return YES; 15 }
2.使用LaunchImage作为启动图,不使用xib
3.配置图标AppIcon
不使用系统渲染图标
4.设置屏幕方向-->只有竖向
5.启动时隐藏状态栏
B.项目分层 & 创建PCH
1.项目分层
为了让在Finder中显示跟Xcode中显示都是分层效果,首先在Finder中建文件目录层次
再把文件目录拖入Xcode
2.创建并配置一个pch文件,来用声明全局公共宏命令
配置:
C.添加子控制器
1.为每个Tab创建一个集成UITableViewController的类
分别是:首页、信息、发现、我
2.创建一个集成UITabBarController的类作为window的rootViewController
AppDelegate:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customization after application launch. 3 4 // 启动后显示状态栏 5 UIApplication *app = [UIApplication sharedApplication]; 6 app.statusBarHidden = NO; 7 8 // 设置window 9 self.window = [[UIWindow alloc] init]; 10 self.window.frame = [UIScreen mainScreen].bounds; 11 12 // 创建根控制器 13 HVWTabBarViewController *tabVC = [[HVWTabBarViewController alloc] init]; 14 self.window.rootViewController = tabVC; 15 16 [self.window makeKeyAndVisible]; 17 18 return YES; 19 }
3.在上述的TabBarController中创建并添加子控件
HVWTabBarViewController.m :
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 // Do any additional setup after loading the view. 4 5 // 添加子控制器 6 // 首页 7 HVWHomeViewController *homeVC = [[HVWHomeViewController alloc] init]; 8 homeVC.view.backgroundColor = [UIColor redColor]; 9 homeVC.title = @"首页"; 10 [self addChildViewController:homeVC]; 11 12 // 消息 13 HVWMessageViewController *messageVC = [[HVWMessageViewController alloc] init]; 14 messageVC.view.backgroundColor = [UIColor blueColor]; 15 messageVC.title = @"消息"; 16 [self addChildViewController:messageVC]; 17 18 // 发现 19 HVWDiscoverViewController *discoverVC = [[HVWDiscoverViewController alloc] init]; 20 discoverVC.view.backgroundColor = [UIColor yellowColor]; 21 discoverVC.title = @"发现"; 22 [self addChildViewController:discoverVC]; 23 24 // 我 25 HVWProfileViewController *profileVC = [[HVWProfileViewController alloc] init]; 26 profileVC.view.backgroundColor = [UIColor greenColor]; 27 profileVC.title = @"我"; 28 [self addChildViewController:profileVC]; 29 }
4.为tab添加图片
1.需求:要区分iOS7之前及之后的系统,使用不同的图片
这里创建一个UIImage的分类,新写一个加载图片的的方法,用来自动检测系统版本并加载不同的图片
(1)iOS6使用普通图片, iOS7及以上系统版本使用的是带有"_os7"结尾的图片
(2)添加一条用来判别系统版本的宏
HVWWeibo-Prefix.pch:
1 #ifndef HVWWeibo_HVWWeibo_Prefix_pch 2 #define HVWWeibo_HVWWeibo_Prefix_pch 3 4 // Include any system framework and library headers here that should be included in all compilation units. 5 // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. 6 7 // 判别是否iOS7或以上版本系统 8 #define iOS7 ([UIDevice currentDevice].systemVersion.doubleValue >= 7.0) 9 10 #endif
(3)创建UIImage+Extension分类
UIImage+Extension.m:
1 #import "UIImage+Extension.h" 2 3 @implementation UIImage (Extension) 4 5 + (UIImage *) imageWithNamed:(NSString *) imageName { 6 UIImage *image = nil; 7 8 // 如果是iOS7或以上版本 9 if (iOS7) { 10 image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_os7", imageName]]; 11 } 12 13 // 如果是iOS6 14 if (nil == image) { 15 image = [UIImage imageNamed:imageName]; 16 } 17 18 return image; 19 } 20 21 @end
(4)添加tab图标
封装一下创建子控制器的代码
HVWTabBarViewController.m:
1 #import "HVWTabBarViewController.h" 2 #import "HVWHomeViewController.h" 3 #import "HVWMessageViewController.h" 4 #import "HVWDiscoverViewController.h" 5 #import "HVWProfileViewController.h" 6 #import "UIImage+Extension.h" 7 8 @interface HVWTabBarViewController () 9 10 @end 11 12 @implementation HVWTabBarViewController 13 14 - (void)viewDidLoad { 15 [super viewDidLoad]; 16 // Do any additional setup after loading the view. 17 18 // 添加子控制器 19 // 首页 20 HVWHomeViewController *homeVC = [[HVWHomeViewController alloc] init]; 21 [self addChildViewController:homeVC WithTitle:@"首页" image:@"tabbar_home" seletectedImage:@"tabbar_home_selected"]; 22 23 // 消息 24 HVWMessageViewController *messageVC = [[HVWMessageViewController alloc] init]; 25 [self addChildViewController:messageVC WithTitle:@"消息" image:@"tabbar_message_center" seletectedImage:@"tabbar_message_center_selected"]; 26 27 // 发现 28 HVWDiscoverViewController *discoverVC = [[HVWDiscoverViewController alloc] init]; 29 [self addChildViewController:discoverVC WithTitle:@"发现" image:@"tabbar_discover" seletectedImage:@"tabbar_discover_selected"]; 30 31 // 我 32 HVWProfileViewController *profileVC = [[HVWProfileViewController alloc] init]; 33 [self addChildViewController:profileVC WithTitle:@"我" image:@"tabbar_profile" seletectedImage:@"tabbar_profile_selected"]; 34 35 } 36 37 /** 添加tab子控制器 */ 38 - (void) addChildViewController:(UIViewController *) viewController WithTitle:(NSString *) title image:(NSString *) imageName seletectedImage:(NSString *) selectedImageName { 39 40 // 设置随机背景色 41 viewController.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]; 42 43 // 设置标题 44 viewController.title = title; 45 // 设置图标 46 viewController.tabBarItem.image = [UIImage imageWithNamed:imageName]; 47 48 // 被选中时图标 49 UIImage *selectedImage = [UIImage imageWithNamed:selectedImageName]; 50 // 如果是iOS7,不要渲染被选中的tab图标(iOS7中会自动渲染成为蓝色) 51 if (iOS7) { 52 selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 53 } 54 viewController.tabBarItem.selectedImage = selectedImage; 55 56 // 添加子控制器 57 [self addChildViewController:viewController]; 58 } 59 60 @end
D.添加导航控制器
1.只是在每个tab的controller上包装了一个UINavigationController
HVWTabBarViewController.m:
1 /** 添加tab子控制器 */ 2 - (void) addChildViewController:(UIViewController *) viewController WithTitle:(NSString *) title image:(NSString *) imageName seletectedImage:(NSString *) selectedImageName { 3 4 // 设置随机背景色 5 viewController.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]; 6 7 // 设置标题,直接设置title可以同时设置tabBarItem和navigationItem的title 8 // viewController.tabBarItem.title = title; 9 // viewController.navigationItem.title = title; 10 viewController.title = title; 11 12 // 设置图标 13 viewController.tabBarItem.image = [UIImage imageWithNamed:imageName]; 14 15 // 被选中时图标 16 UIImage *selectedImage = [UIImage imageWithNamed:selectedImageName]; 17 // 如果是iOS7,不要渲染被选中的tab图标(iOS7中会自动渲染成为蓝色) 18 if (iOS7) { 19 selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 20 } 21 viewController.tabBarItem.selectedImage = selectedImage; 22 23 // 添加子控制器 24 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController]; 25 [self addChildViewController:nav]; 26 }
2.进入非NavigationController的rootViewController的时候,隐藏底部的TabBar
自定义一个集成UINavigationController的类,代替原来的原生类
重写pushViewController方法,当push的时候隐藏TabBar
#mark:此方法可以作用与所有的非rootViewController,非常好用
HVWNavigationViewController.m:
1 #import "HVWNavigationViewController.h" 2 3 @interface HVWNavigationViewController () 4 5 @end 6 7 @implementation HVWNavigationViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 // Do any additional setup after loading the view. 12 } 13 14 - (void)didReceiveMemoryWarning { 15 [super didReceiveMemoryWarning]; 16 // Dispose of any resources that can be recreated. 17 } 18 19 /** 重写push方法 */ 20 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { 21 // 如果不是根控制器,隐藏TabBar 22 if (self.viewControllers.count > 0) { 23 // 注意这里不是self(navigationController),是push出来的ViewContoller隐藏TabBar 24 viewController.hidesBottomBarWhenPushed = YES; 25 } 26 27 // 最后一定要调用父类的方法 28 [super pushViewController:viewController animated:animated]; 29 } 30 31 @end
E.添加导航栏按钮
需要给各个Tab还有其下的页面添加导航栏按钮
1.在pch文件添加一个随机颜色宏定义和一个debug模式下的log函数
1 // HVWWeibo-Prefix.pch 2 #ifndef HVWWeibo_HVWWeibo_Prefix_pch 3 #define HVWWeibo_HVWWeibo_Prefix_pch 4 5 // Include any system framework and library headers here that should be included in all compilation units. 6 // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. 7 8 #ifdef __OBJC__ 9 #import <UIKit/UIKit.h> 10 #import <Foundation/Foundation.h> 11 #import "UIImage+Extension.h" 12 #endif 13 14 // 测试用log 15 #ifdef DEBUG 16 #define HVWLog(...) NSLog(__VA_ARGS__) 17 #else 18 #define HVWLog(...) 19 #endif 20 21 // 判别是否iOS7或以上版本系统 22 #define iOS7 ([UIDevice currentDevice].systemVersion.doubleValue >= 7.0) 23 24 // 随机颜色 25 #define RandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0] 26 27 28 #endif
使用宏定义的log函数,只有在debug模式下才会转化成为NSLog,release的时候会转为空
1 /** 寻找朋友按钮事件 */ 2 - (void) searchFriend { 3 HVWLog(@"searchFriend"); 4 }
这里可以修改运行模式:
2.创建一个集成UIBarButtonItem的分类,用来创建使用UIButton作为按钮图标的item
1 // 2 // UIBarButtonItem+Extension.m 3 // HVWWeibo 4 // 5 // Created by hellovoidworld on 15/1/31. 6 // Copyright (c) 2015年 hellovoidworld. All rights reserved. 7 // 8 9 #import "UIBarButtonItem+Extension.h" 10 11 @implementation UIBarButtonItem (Extension) 12 13 + (instancetype) itemWithImage:(NSString *) imageName hightlightedImage:(NSString *) highlightedImageName target:(id)target selector:(SEL)selector { 14 UIBarButtonItem *item = [[self alloc] init]; 15 16 // 创建按钮 17 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 18 UIImage *image = [UIImage imageNamed:imageName]; 19 [button setImage:image forState:UIControlStateNormal]; 20 [button setImage:[UIImage imageNamed:highlightedImageName] forState:UIControlStateHighlighted]; 21 22 // 一定要设置frame,才能显示 23 button.frame = CGRectMake(0, 0, image.size.width, image.size.height); 24 25 // 设置事件 26 [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 27 28 item.customView = button; 29 return item; 30 } 31 32 @end
3.sample:在“首页”页面加上导航栏按钮
1 // HVWHomeViewController.m 2 - (void)viewDidLoad { 3 [super viewDidLoad]; 4 5 // 添加导航控制器按钮 6 // 左边按钮 7 self.navigationItem.leftBarButtonItem = [HVWBarButtonItem itemWithImage:@"navigationbar_friendsearch" hightlightedImage:@"navigationbar_friendsearch_highlighted" target:self selector:@selector(searchFriend)]; 8 9 // 右边按钮 10 self.navigationItem.rightBarButtonItem = [HVWBarButtonItem itemWithImage:@"navigationbar_pop" hightlightedImage:@"navigationbar_pop_highlighted" target:self selector:@selector(pop)]; 11 } 12 13 /** 左边导航栏按钮事件 */ 14 - (void) searchFriend { 15 HVWLog(@"searchFriend"); 16 } 17 18 /** 右边导航栏按钮事件 */ 19 - (void) pop { 20 HVWLog(@"pop"); 21 }
4.给所有非rootViewController加上“返回”按钮和“直接回到rootViewController”按钮
在HVWNavigationViewController的push方法中实现
#mark:由于是在NavigationController中实现,可以一举实现在所有非rootViewController中的效果。
1 // HVWNavigationViewController.m 2 /** 重写push方法 */ 3 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { 4 // 如果不是根控制器,隐藏TabBar 5 if (self.viewControllers.count > 0) { 6 // 注意这里不是self(navigationController),是push出来的ViewContoller隐藏TabBar 7 viewController.hidesBottomBarWhenPushed = YES; 8 9 // 加上“返回上一层”按钮和“直接回到根控制器”按钮 10 viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithImage:@"navigationbar_back" hightlightedImage:@"navigationbar_back_highlighted" target:self selector:@selector(back)]; 11 12 viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithImage:@"navigationbar_more" hightlightedImage:@"navigationbar_more_highlighted" target:self selector:@selector(more)]; 13 } 14 15 // 最后一定要调用父类的方法 16 [super pushViewController:viewController animated:animated]; 17 } 18 19 /** 返回上一层 */ 20 - (void) back { 21 [self popViewControllerAnimated:YES]; 22 } 23 24 /** 返回根控制器 */ 25 - (void) more { 26 [self popToRootViewControllerAnimated:YES]; 27 }