iOS实战01

  去年放假之前大概完成了新浪微博项目,到现在也忘得差不多了,打算在重新写一遍。之前的一些笔记在新浪的博客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 == 1) {
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[0].center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
34
35     for (int index = 0; 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 = 0;
42         if (index>1) {
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:13]];
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(0, 0, 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(0, 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(0, 0, plusBtn.currentBackgroundImage.size.width, plusBtn.currentBackgroundImage.size.height);
11
12         [self addSubview:plusBtn];
13     }
14     return self;
15 }

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

时间: 2024-11-08 20:08:09

iOS实战01的相关文章

iOS.TextKit.01.凸版印刷效果

1.案例视图,如下图 2.代码 TextKit01ViewController.h #import <UIKit/UIKit.h> @interface TextKit01ViewController : UIViewController @property (nonatomic,strong) IBOutlet UITextView *textView; // 文本可以排版的区域 @property (nonatomic,strong) NSTextContainer *textContai

iOS基础 01 构建HelloWorld,剖析并真机测试

iOS基础 01 构建HelloWorld,剖析并真机测试 前言: 从控制台输出HelloWorld是我们学习各种语言的第一步,也是我们人生中非常重要的一步. 多年之后,我希望我们仍能怀有学习上进的心情,继续以HelloWorld去认识这世界上更多的东西. 本篇以HelloWorld作为切入点,向大家系统介绍什么事iOS应用以及如何使用Xcode创建iOS应用. 目录: 1. 创建HelloWorld工程 1.1. 设计界面 1.2. 真机测试 2. Xcode中的iOS工程模板 2.1. Ap

关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

?? 承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718.html 欢迎关注关东升新浪微博@tony_关东升. 关注智捷课堂微信公共平台,了解最新技术文章.图书.教程信息 更多精品iOS.Cocos.移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php 版权声明:本文为博主原

关东升的iOS实战系列图书 《iOS实战:传感器卷(Swift版)》已经上市

?? 承蒙广大读者的厚爱我的 <iOS实战:传感器卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11760248.html 欢迎关注关东升新浪微博@tony_关东升. 关注智捷课堂微信公共平台,了解最新技术文章.图书.教程信息 更多精品iOS.Cocos.移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php 版权声明:本文为博主原创文

关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了

承蒙广大读者的厚爱我的<iOS实战:图形图像.动画和多媒体卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见..http://item.jd.com/11760249.html 欢迎关注关东升新浪微博@tony_关东升. 关注智捷课堂微信公共平台,了解最新技术文章.图书.教程信息 更多精品iOS.Cocos.移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php

蓝懿IOS实战音乐播放器

今天刘国斌老师教了实战的一个demo,仿写音乐播放器 // 1. 如果在viewcontroller里跳转到别的页面里,另一个viewcontroller是storyboard拖出来的,初始化页面需要用self.stroy 再调用方法,instantiateViewControllerWithIdentifier // 2. 但是如果在其他的页面不是viewcontroller里再跳转到另一个页面,那个页面也是用stroyboard拖出来的,那么就要用 UIStoryboard 通过自己的mai

iOS 多线程 01

进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以开启多条线程,多条线程可以并行(同时)执行不同的任务 线程可以并行, 但是每个线程中的任务还是串行 多线程原理 多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 多线程优缺点 优点 能适当提高程序的执行效率 能适当提高资源利用率(CPU.内存利用率) 缺点 线程越多,CPU在调度

iOS实战(零):开发社区、文档等资源

社区 Apple官方资源 Xcode文档库: Window->Documentation and API Reference (可以在xcode的Preferences中下载最新的文档) iOS Developer center: developer.apple.com->member center (这里可以下载最新的SDK等信息) Open Source1: developer.apple.com/opensource/ (苹果很多组件的源代码) Open Source2: opensou

ios实战-消除类游戏Dots

使用原生的ios UIKit实现简单的消除类游戏,还没完全完成,不大想继续做了,所以写个博客大家分享下: 先上源码:http://git.oschina.net/jonear/LianLianDots -----------------------------------------又是凌乱的分割线----------------------------------------------------- 主要是分享下这个游戏的结构设计吧,整体还是很简单的: Manager: LLDGameMan