首页 > 代码库 > [iOS微博项目 - 1.0] - 搭建基本框架

[iOS微博项目 - 1.0] - 搭建基本框架

A.搭建基本环境
 
github: https://github.com/hellovoidworld/HVWWeibo
 
项目结构:
技术分享
 
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     // 如果是iOS614     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 @end11 12 @implementation HVWTabBarViewController13 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     // 如果不是根控制器,隐藏TabBar22     if (self.viewControllers.count > 0) {23         // 注意这里不是self(navigationController),是push出来的ViewContoller隐藏TabBar24         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 #endif13 14 // 测试用log15 #ifdef DEBUG16     #define HVWLog(...) NSLog(__VA_ARGS__)17 #else18     #define HVWLog(...)19 #endif20 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 }

 

 

[iOS微博项目 - 1.0] - 搭建基本框架