去年放假之前大概完成了新浪微博项目,到现在也忘得差不多了,打算在重新写一遍。之前的一些笔记在新浪的博客SleenXiu,在这主要是把新浪微博以随笔的形式写在这,方便以后的复习。

  先看看之前主要完成的几个点,秒拍视频连接:http://video.weibo.com/show?fid=1034:32ed06b90b1bba7ba25cc546a06fa949

  今天开始重新写一遍,在这记下来。

  经典框架的搭建,所谓经典框架就是最底层为UITabBarController,管理几个UINavigationController,不同的UINavigationController又管理相应的VC。

  1.在appdelegate中完成初步的框架搭建,我们需要一个自定义的UITabBarController,并成为window的根控制器。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // 设置窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 初始化自己的tabbarController
SVTabbarController *tabbar = [[SVTabbarController alloc] init]; // 为窗口添加根控制器,
self.window.rootViewController = tabbar; // 显示窗口
[self.window makeKeyAndVisible]; return YES;
}

  2.对文件进行分组,按照模块分,下面的MVC结构。

  3.在自己的tabbarcontroller中为其添加子控制器[self addController],为方法编写代码。(后面会对这段代码进行优化)

 // 添加子控制器
- (void)addController
{
SVHomeController *homeVC = [[SVHomeController alloc] init];
SVNavigationController *homeNav = [[SVNavigationController alloc] initWithRootViewController:homeVC];
homeVC.title = @"首页";
homeVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_home_os7"];
homeVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected_os7"];
[self addChildViewController:homeNav]; SVHomeController *messageVC = [[SVHomeController alloc] init];
SVNavigationController *messageNav = [[SVNavigationController alloc] initWithRootViewController:messageVC];
messageVC.title = @"消息";
messageVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_message_center_os7"];
messageVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_message_center_selected_os7"];
[self addChildViewController:messageNav]; SVHomeController *discoverVC = [[SVHomeController alloc] init];
SVNavigationController *discoverNav = [[SVNavigationController alloc] initWithRootViewController:discoverVC];
discoverVC.title = @"发现";
discoverVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover_os7"];
discoverVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_discover_selected_os7"];
[self addChildViewController:discoverNav]; SVHomeController *meVC = [[SVHomeController alloc] init];
SVNavigationController *meNav = [[SVNavigationController alloc] initWithRootViewController:meVC];
meVC.title = @"我";
meVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile_os7"];
meVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_profile_selected_os7"];
[self addChildViewController:meNav];
}

基本效果已经有了

  4.tabbar的导航不是想要的效果,删除系统自带的tabbaritem,添加自定义tabbar,[self addtabbar]。

 // 移除系统的tabbar,view将要出现的时候删除掉原有tabbar上所有的item
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; for (UIView *child in self.tabBar.subviews) {
if ([child isKindOfClass:[UIColor class]]) {
[child removeFromSuperview];
}
}
}
// 增加自己的tabbar
- (void)addTabbar
{
// 初始化自己的tabbar
SVTabbar *tabbar = [[SVTabbar alloc] initWithFrame:self.tabBar.bounds];
// 保存自己的tabbar
self.mytabbar = tabbar;
// 添加自己的tabbar
[self.tabBar addSubview:tabbar];
// 为tabbar添加代理
tabbar.delegate = self; }

  5.封装自己的tabbar,添加控件,自定义按钮item,完成跳转

  5-1.添加控件,根据有多少个控制器添加相应个数的btn,而btn的相应值通过item进行传递,在tabbar中提供- (void)addBtnWithItem:(UITabbarItem)item;方法添加自己的item(btn)
 - (void)addBtnWithItem:(UITabBarItem *)item
{
// 初始化btn
SVTabbarButton *btn = [[SVTabbarButton alloc] init];
// 保存btn
[self.tabbarBtns addObject:btn];
// 赋值btn
btn.item = item;
// 添加btn
[self addSubview:btn];
// 为按钮绑定点击事件
[btn addTarget:self action:@selector(selectedBtn:) forControlEvents:UIControlEventTouchUpInside];
// 默认选中第一个
if (self.tabbarBtns.count == ) {
[self selectedBtn:btn];
}
}
// 按钮的点击事件
- (void)selectedBtn:(SVTabbarButton *)btn
{
// 通知代理
if ([self.delegate respondsToSelector:@selector(tabbar:didSelectBtnFrom:to:)]) {
[self.delegate tabbar:self didSelectBtnFrom:(int)self.currentBtn.tag to:(int)btn.tag];
}
// 设置tabbar的选中
self.currentBtn.selected = NO;
btn.selected = YES;
self.currentBtn = btn;
}
// 布局按钮
- (void)layoutSubviews
{
self.subviews[].center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); for (int index = ; index<self.tabbarBtns.count; index++) {
SVTabbarButton *btn = self.tabbarBtns[index]; CGFloat bW = self.frame.size.width/self.subviews.count;
CGFloat bH = self.frame.size.height;
CGFloat bX = index * bW;
CGFloat bY = ;
if (index>) {
bX += bW;
}
btn.frame = CGRectMake(bX, bY, bW, bH); btn.tag = index;
}
}
  5-2.自定义按钮,重新布局按钮的位置,并对按钮进行赋值数据,有四个控制器,所以重构添加控制器的方法,根据不同的控制器为相应属性赋值。
 // 重新布局btn内部的控件得到想要的效果
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
// 图片居中显示
self.imageView.contentMode = UIViewContentModeCenter;
// 文本居中显示
self.titleLabel.textAlignment = NSTextAlignmentCenter;
// 设置字体大小
[self.titleLabel setFont:[UIFont systemFontOfSize:]]; // 设置字体颜色
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
}
return self;
}
// 重写item的set方法,对btn进行赋值
- (void)setItem:(UITabBarItem *)item
{
_item = item; [self setTitle:item.title forState:UIControlStateNormal];
[self setImage:item.image forState:UIControlStateNormal];
[self setImage:item.selectedImage forState:UIControlStateSelected];
}
// 内部图片的位置
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
CGFloat imageW = contentRect.size.width;
CGFloat imageH = contentRect.size.height * 0.6;
return CGRectMake(, , imageW, imageH); }
// 内部文字的位置
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
CGFloat titleY = contentRect.size.height * 0.6;
CGFloat titleW = contentRect.size.width;
CGFloat titleH = contentRect.size.height - titleY;
return CGRectMake(, titleY, titleW, titleH);
}
// 去掉按钮的高亮状态
- (void)setHighlighted:(BOOL)highlighted {}
  5-3.完成点击按钮控制器的跳转,取消按钮高亮状态,默认选中第一的按钮,按钮绑定点击事件,为自定义的tabbar写代理,监听按钮点击跳转控制器
 @protocol SVTabbarDelegate <NSObject>
@optional
// 当tabbar上的按钮点击的时候会调用
- (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to;
@end
 #pragma mark tabbar的代理方法
- (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to
{
self.selectedIndex = to;
}
  6.添加中间的加号按钮,位置固定所以直接一次设置就好
 - (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_os7"] forState:UIControlStateNormal];
[plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted_os7"] forState:UIControlStateHighlighted];
[plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_os7"] forState:UIControlStateNormal];
[plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted_os7"] forState:UIControlStateHighlighted];
plusBtn.frame = CGRectMake(, , plusBtn.currentBackgroundImage.size.width, plusBtn.currentBackgroundImage.size.height); [self addSubview:plusBtn];
}
return self;
}

  今天就先做这一点,基本大的框架就已经好了,明天修一下细节。

iOS实践01的更多相关文章

  1. 使用Bootstrap 3开发响应式网站实践01,前期准备、导航区域等

    "使用Bootstrap 3开发响应式网站实践"系列,将使用Bootstrap 3.2制作一个自适应网站,无论是在电脑.平板,还是手机上,都呈现比较好的效果.在电脑浏览器上的最终效 ...

  2. iOS设计模式(01):观察者

    iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...

  3. AJ学IOS(01) UI之Hello World与加法计算器

    不多说,AJ分享,必须精品 这两个一个是HelloWorld(左边) 另一个是 加法计算器(右边)的截图. 先运行第一个 程序看看效果 1.打开Xcode(没有哦mac系统的没有xcode的帮你们默哀 ...

  4. iOS实践03

    主要目标:版本新特性界面,新浪授权界面(登录界面)的处理 任务基本完成了,基本的框架也就到这了,接下来的应该是首页获取微博了. 1.版本新特性,可以单独作为一个model,写完之加入到项目中.我们新建 ...

  5. Spring Cloud开发实践 - 01 - 简介和根模块

    简介 使用Spring Boot的提升主要在于jar的打包形式给运维带来了很大的便利, 而Spring Cloud本身的优点不是那么明显, 相对于Dubbo而言, 可能体现在跨语言的交互性上(例如可以 ...

  6. Shiny学习实践01

    Shiny是什么东东? 官方描述: Shiny is an R package that makes it easy to build interactive web apps straight fr ...

  7. 我的iOS动画01

    1.嵌套使用,先变大再消失 [UIView animateWithDuration:1.25 aniamtions:^{ CGAffineTransform newTRansform = CGAffi ...

  8. MatrixOne从入门到实践01——初识MatrixOne

    初识MatrixOne 简介 MatrixOrigin 矩阵起源 是一家数据智能领域的创新企业,其愿景是成为数字世界的核心技术提供者. 物理世界的数字化和智能化无处不在.我们致力于建设开放的技术开源社 ...

  9. iOS实践04

    第四天 微博数据展示:获取服务器数据,json数据的解析,MVC的使用,自定义cell高度的计算,一些分类的设计.已经是第四天了,虽然每天都有课程,但这个东西也基本完成了一大半吧,一些忘掉的知识也捡起 ...

随机推荐

  1. 安装vmware tools失败解决方法

    失败提示: reating a new initrd boot image for the kernel. update-initramfs: Generating /boot/initrd.img- ...

  2. c++编程中的后缀

    .a 静态库 (archive) .C.c.cc.cp.cpp.cxx.c++ C++源代码(需要编译预处理) .h C或者C++源代码头文件 .ii C++源代码(不需编译预处理) .o 对象文件 ...

  3. [C#]DataTable常用操作总结

    ].RowState == DataRowState.Unchanged)        {            //Your logic        }        //⑩Convert to ...

  4. 分布式-在win7上安装linux操作系统

    由于大多数的分布式计算框架.分布式存储系统.分布式平台都支持在unix类似的环境下.所以要做分布式的实验和学习的话,还是推荐装个linux系统.我这里安装的是ubuntu,由于之前装过这个. 一.下载 ...

  5. android 基本控件使用

    http://tech.it168.com/a2012/0321/1327/000001327704.shtml Android_ListView_用代码控制ListView的位置 有三种方法 mli ...

  6. protobuf使用错误总结

    1>HelloWorldScene.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall LoginReqMessage ...

  7. CentOS7与Win7双系统引导问题

    先安装的Win7,后安装的CentOS7,结果系统引导就只有CentOS7了.记得以前CentOS6.x系列没这个问题,主要是由于CentOS7.x使用grub2的原因吧. 方案一:使用Win PE. ...

  8. Description:一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。如果连续对折2次,中间切一刀,可以得到5根面条。Input:你的程序需要解决的问题是,输入连续对折的次数。NOutput输出中间切一刀,可以得到多少根面条。

    #include<iostream> using namespace std ; int main() { int n ; while(cin >> n) { << ...

  9. MySQL管理一些基础SQL语句

    .进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; .查询所有数据的大小: ),),'MB') as data from i ...

  10. [分 享] PHPCMS V9 更换域名,附件地址无法批更新(更换变便)问题>解决方法!!

    大家应该都有在域名更换(比如说,从本地上传到空间)的情况下,用内容>附件管理>附件地址替换 功能. 基本上替换不了所有表中原来域名的地址. 现PHPCMS V9最新版本的依旧存在些问题. ...