[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     // 如果是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 }
时间: 2024-11-02 23:26:14

[iOS微博项目 - 1.0] - 搭建基本框架的相关文章

[iOS微博项目 - 3.0] - 手动刷新微博

github: https://github.com/hellovoidworld/HVWWeibo A.下拉刷新微博 1.需求 在“首页”界面,下拉到一定距离的时候刷新微博数据 刷新数据的时候使用控件提示 新数据要加在旧数据的前面 刷新完毕隐藏刷新控件 刷新数据完毕,导航栏下方弹出一个提示框,提示刷新微博数量 2.思路 直接使用系统自带的UIRefreshControl就可以做出动画效果 使用微博的获取微博API参数since_id可以控制加载的微博从哪个id开始 使用可变数组来拼接新旧微博数

[iOS微博项目 - 2.0] - OAuth授权3步

A.概念 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的.oAuth是Open Authorization的简写. B.使用3步骤 OAUTH认证授权就三个步骤,三句话可以概括: 1. 获取未授权的Request Token 2. 获取用户授权的Request Token 3. 用授权的Requ

[iOS微博项目 - 4.0] - 自定义微博cell

github: https://github.com/hellovoidworld/HVWWeibo A.自定义微博cell基本结构 1.需求 创建自定义cell的雏形 cell包含:内容.工具条 内容包含:原创内容.转发内容 2.思路 使用分层控件,逐层实现 分离model和view model:数据模型.frame模型 view:就是控件本身 frame模型:包含数据模型和子控件frame 根据数据模型来决定子控件是否显示(例如转发内容) cell的view设计雏形: 控件的成员属性层次:

iOS开发项目篇—40搭建cell的基本结构

iOS开发项目篇—40搭建cell的基本结构 一.简单说明 1.策略:针对微博可能出现的多种情况(只有文字,有文字有配图,有转发微博等),一次性加载所用的子控件到cell中,对于没有数据的空间进行隐藏.(不管cell以后会显示什么子控件,把所有有可能显示的子控件都添加上去·添加到contentView上) 微博cell的显示示例: 2.自定义cell的步骤: 1.新建一个继承自UITablecell的子类 2.在initWithStyle:方法中进行子控件的初始化 (1)将有可能显示的所有子控件

iOS开发项目-01环境搭建

iOS开发项目-01环境搭建 一.基本过程 1.新建一个项目 (1)删除storyboard (2)在配置界面中,把main  删除,手动设置 2.准备素材 图片素材如下: 这个项目是模仿新浪,实现一个山寨的新浪微博系统,新版本的系统中已经放弃了非视网膜屏幕. 说白了,这种情况下,如果手机是3.5英寸的ios7系统,则看不到该启动动画. 设置方法,右键单击show in finder,修改json文件. Contents.json,对文件进行修改,让系统启动画面对3.5英寸的ios7系统提供支持

iOS UI进阶-1.0网易彩票框架搭建

仿网易彩票,最终要做成的效果如下: 一.分层搭建 1.新建一个项目,Lottery.只支持7.1以上坚屏. 2.将素材全部图片全部拉到相应的文件夹里. 3.选中Lottery--右键Show in Finder ,在Lottery文件夹下新建一个Classes,并分别分层成MVC文件夹. 4.把Classes拉到Lottery项目里,整个框架结构如 二.UI搭建 分层好之后,接下来,我们搭建一下界面.使用Storyboard进行搭建. 1.点击Main.storyboard,删除原来的界面,分别

[iOS微博项目 - 2.6] - 获取微博数据

github: https://github.com/hellovoidworld/HVWWeibo   A.新浪获取微博API 1.读取微博API 2.“statuses/home_timeline”接口 B.在app中获取微博数据 1.在“首页”控制器发送请求,获取json数据 1 /** 加载微博数据 */ 2 - (void) loadWeiboData { 3 // 创建AFNetworking的http操作中管理器 4 AFHTTPRequestOperationManager *m

蓝懿ios微博项目之扩展首页

// ---------------------- 功能分区 ----------------------------- // 到这步,想要实现在自定义的每个tablecell上添加一个toolbar的view,上面放着三个lable(点赞,评论,转发的数量),所以要再自定义一个view类 // 自定义的 LYWeiboToolbarView 在xib里右侧功能区点击第一个图标把Use Autolayout自动布局点空取消,之后在尺寸的一栏给距离俯视图的下边缘加约束,距离为0.(实现toolba

蓝懿ios微博项目之自定义cell

/重写转发微博View的get方法  懒加载,实现了转发微博view复用 // 懒加载就是在程序运行后,不是一下子加载很多的控件,而是后期需要的时候再复用 // 懒加载的形式是重写get方法的同时,里面进行判断跟着 if(obj==nil),这种形式 //  这里的转发的微博view也要考虑view的复用问题 -(LYWeiboView *)reWeiboView{ // if里面判断进行的时候要写成_reWeiboView,如果写self.reWeiboView,它属于_eWeiboView的