iOS实践01
去年放假之前大概完成了新浪微博项目,到现在也忘得差不多了,打算在重新写一遍。之前的一些笔记在新浪的博客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,完成跳转
- - (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;
- }
- }
- // 重新布局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 {}
- @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;
- }
- - (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的更多相关文章
- 使用Bootstrap 3开发响应式网站实践01,前期准备、导航区域等
"使用Bootstrap 3开发响应式网站实践"系列,将使用Bootstrap 3.2制作一个自适应网站,无论是在电脑.平板,还是手机上,都呈现比较好的效果.在电脑浏览器上的最终效 ...
- iOS设计模式(01):观察者
iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...
- AJ学IOS(01) UI之Hello World与加法计算器
不多说,AJ分享,必须精品 这两个一个是HelloWorld(左边) 另一个是 加法计算器(右边)的截图. 先运行第一个 程序看看效果 1.打开Xcode(没有哦mac系统的没有xcode的帮你们默哀 ...
- iOS实践03
主要目标:版本新特性界面,新浪授权界面(登录界面)的处理 任务基本完成了,基本的框架也就到这了,接下来的应该是首页获取微博了. 1.版本新特性,可以单独作为一个model,写完之加入到项目中.我们新建 ...
- Spring Cloud开发实践 - 01 - 简介和根模块
简介 使用Spring Boot的提升主要在于jar的打包形式给运维带来了很大的便利, 而Spring Cloud本身的优点不是那么明显, 相对于Dubbo而言, 可能体现在跨语言的交互性上(例如可以 ...
- Shiny学习实践01
Shiny是什么东东? 官方描述: Shiny is an R package that makes it easy to build interactive web apps straight fr ...
- 我的iOS动画01
1.嵌套使用,先变大再消失 [UIView animateWithDuration:1.25 aniamtions:^{ CGAffineTransform newTRansform = CGAffi ...
- MatrixOne从入门到实践01——初识MatrixOne
初识MatrixOne 简介 MatrixOrigin 矩阵起源 是一家数据智能领域的创新企业,其愿景是成为数字世界的核心技术提供者. 物理世界的数字化和智能化无处不在.我们致力于建设开放的技术开源社 ...
- iOS实践04
第四天 微博数据展示:获取服务器数据,json数据的解析,MVC的使用,自定义cell高度的计算,一些分类的设计.已经是第四天了,虽然每天都有课程,但这个东西也基本完成了一大半吧,一些忘掉的知识也捡起 ...
随机推荐
- [置顶] 有关ListIterator接口的add与remove方法探究
ListIterator接口继承自Iterator接口,新增了add()等方法. 关于ListIterator的add()方法的作用(接口是没有方法实现的,但其实现类对于add()方法的实现机制大致相 ...
- 不错的JS
http://www.17sucai.com/preview/47509/2013-10-18/Sequence-master/photo-stack/index.html
- DQL
DQL(Data QueryLanguage) 基本格式 select * from 表名 对于列进行限制 格式一:取指定列 select 列1,列2 from 表名 格式二:为列起别名的三种表示法, ...
- Sql Server 服务器名称\实例名称 无法连接 Server Name\Instance Name
解决步骤: 1: Sql Server是否已经启动. 2: 检查Sql Server服务器是否开启TCP/IP协议. 侦听的默认端口为1433 3: ping 数据库 ...
- ORACLE函数TO_CHAR以及数字转换格式[Z]
本来这是很简单的函数,但在屡次忘记格式之后,决定还是翻译一遍以铭记在心. 参考<<Oracle Database SQL Reference>>. 关于nl ...
- jQuery EasyUI combobox多选和赋值
定义select <select id="ID" name=empVO.acunid class="easyui-combobox" required=& ...
- Java生成缩略图之Thumbnailator
Thumbnailator 是一个为Java界面更流畅的缩略图生成库.从API提供现有的图像文件和图像对象的缩略图中简化了缩略过程,两三行代码就能够从现有图片生成缩略图,且允许微调缩略图生成,同时保持 ...
- 在网页中使用javascript提供反馈信息
一,使用document.write() 二,使用window方法,prompt(),alert()和confirm() <html lang="en"> < ...
- hibernate中多对多关联
hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...
- cookie记录用户的浏览商品的路径
在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联. 下面将使用cookie记录用户的浏览过的历史页面.该网站将每个页面的标题保存在该页面的$TIT ...