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

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

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

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

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

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2. // Override point for customization after application launch.
  3.  
  4. // 设置窗口
  5. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  6.  
  7. // 初始化自己的tabbarController
  8. SVTabbarController *tabbar = [[SVTabbarController alloc] init];
  9.  
  10. // 为窗口添加根控制器,
  11. self.window.rootViewController = tabbar;
  12.  
  13. // 显示窗口
  14. [self.window makeKeyAndVisible];
  15.  
  16. return YES;
  17. }

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

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

  1. // 添加子控制器
  2. - (void)addController
  3. {
  4. SVHomeController *homeVC = [[SVHomeController alloc] init];
  5. SVNavigationController *homeNav = [[SVNavigationController alloc] initWithRootViewController:homeVC];
  6. homeVC.title = @"首页";
  7. homeVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_home_os7"];
  8. homeVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected_os7"];
  9. [self addChildViewController:homeNav];
  10.  
  11. SVHomeController *messageVC = [[SVHomeController alloc] init];
  12. SVNavigationController *messageNav = [[SVNavigationController alloc] initWithRootViewController:messageVC];
  13. messageVC.title = @"消息";
  14. messageVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_message_center_os7"];
  15. messageVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_message_center_selected_os7"];
  16. [self addChildViewController:messageNav];
  17.  
  18. SVHomeController *discoverVC = [[SVHomeController alloc] init];
  19. SVNavigationController *discoverNav = [[SVNavigationController alloc] initWithRootViewController:discoverVC];
  20. discoverVC.title = @"发现";
  21. discoverVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover_os7"];
  22. discoverVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_discover_selected_os7"];
  23. [self addChildViewController:discoverNav];
  24.  
  25. SVHomeController *meVC = [[SVHomeController alloc] init];
  26. SVNavigationController *meNav = [[SVNavigationController alloc] initWithRootViewController:meVC];
  27. meVC.title = @"我";
  28. meVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile_os7"];
  29. meVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_profile_selected_os7"];
  30. [self addChildViewController:meNav];
  31. }

基本效果已经有了

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

  1. // 移除系统的tabbar,view将要出现的时候删除掉原有tabbar上所有的item
  2. - (void)viewWillAppear:(BOOL)animated
  3. {
  4. [super viewWillAppear:animated];
  5.  
  6. for (UIView *child in self.tabBar.subviews) {
  7. if ([child isKindOfClass:[UIColor class]]) {
  8. [child removeFromSuperview];
  9. }
  10. }
  11. }
  12. // 增加自己的tabbar
  13. - (void)addTabbar
  14. {
  15. // 初始化自己的tabbar
  16. SVTabbar *tabbar = [[SVTabbar alloc] initWithFrame:self.tabBar.bounds];
  17. // 保存自己的tabbar
  18. self.mytabbar = tabbar;
  19. // 添加自己的tabbar
  20. [self.tabBar addSubview:tabbar];
  21. // 为tabbar添加代理
  22. tabbar.delegate = self;
  23.  
  24. }

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

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

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

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. [置顶] 有关ListIterator接口的add与remove方法探究

    ListIterator接口继承自Iterator接口,新增了add()等方法. 关于ListIterator的add()方法的作用(接口是没有方法实现的,但其实现类对于add()方法的实现机制大致相 ...

  2. 不错的JS

    http://www.17sucai.com/preview/47509/2013-10-18/Sequence-master/photo-stack/index.html

  3. DQL

    DQL(Data QueryLanguage) 基本格式 select * from 表名 对于列进行限制 格式一:取指定列 select 列1,列2 from 表名 格式二:为列起别名的三种表示法, ...

  4. Sql Server 服务器名称\实例名称 无法连接 Server Name\Instance Name

      解决步骤: 1:  Sql Server是否已经启动. 2:  检查Sql Server服务器是否开启TCP/IP协议. 侦听的默认端口为1433          3:     ping 数据库 ...

  5. ORACLE函数TO_CHAR以及数字转换格式[Z]

    本来这是很简单的函数,但在屡次忘记格式之后,决定还是翻译一遍以铭记在心.      参考<<Oracle Database SQL Reference>>.      关于nl ...

  6. jQuery EasyUI combobox多选和赋值

    定义select <select id="ID" name=empVO.acunid class="easyui-combobox" required=& ...

  7. Java生成缩略图之Thumbnailator

    Thumbnailator 是一个为Java界面更流畅的缩略图生成库.从API提供现有的图像文件和图像对象的缩略图中简化了缩略过程,两三行代码就能够从现有图片生成缩略图,且允许微调缩略图生成,同时保持 ...

  8. 在网页中使用javascript提供反馈信息

    一,使用document.write() 二,使用window方法,prompt(),alert()和confirm()   <html lang="en"> < ...

  9. hibernate中多对多关联

    hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...

  10. cookie记录用户的浏览商品的路径

    在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联. 下面将使用cookie记录用户的浏览过的历史页面.该网站将每个页面的标题保存在该页面的$TIT ...