新浪微博项目中我学会的东西

微博中我学会的东西:

1.项目环境的搭建(推送,版本号,支持的iOS几版本几以上的,用与不用StoryBoard两种建立方式,APPIcon,启动图片的两种方式,还有项目类的前缀)

1.1 创建窗口:

//创建窗口

//不能使用局部变量(UIWindow *window)

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

self.window.backgroundColor = [UIColor whiteColor];

//显示窗口

[self.window makeKeyAndVisible];

1.2创建TabBar 的时候记得不要作为子视图加载到窗口,这不会支持旋转,要做为窗口的子视图加载。

1.3区分好.bounds 和 .ApplicationFrame

.bounds 是从原点(0,0)开始

.ApplicationFrame  是从图形的Frame末端开始

2.系统主流框架(TabBarController 控制导航栏)

(1)第一点封装好TabBarVC,自己的事情自己管理

(2)UITabBarController的View是 控制器一创建就加载,  UIViewController 是懒加载(用到的时候才会去加载)。

(3)封装的好处,是把项目以后用到的相同的功能的抽出一类,怎么封装,自己的事情自己管理

抽方法:一个功能一个方法。

(4)如何可以让图片选中保持图片的颜色,修改图片的渲染样式:保持图片的原来的样式。

(5)如何以后项目中会用到的一个功能抽出来:

<1>创建一个类目,填写的类就是用来调用类方法的类

<2>考虑哪些是受外面的控制的,然后针对这些考虑,要创建什么对象,然后创建类方法。

<6>当项目中敲不出:UIImage 的时候,记得导入框架 <UIKit/UIKit.h>

(6)在同一个类中会重复用到的功能或则相同的功能的,记得抽出一个方法。有外界决定的属性,记得把它作为参数进行传值。要写中文的参数放在最后面。

(7)要把某一些功能设置做成全局的话, 可以在:

////什么时候调用:当程序一启动的时候就调用

////什么作用加载所有的类

//+(void)load

//{

//

//}

//什么时候调用:当程序调用这个类的时候还有它的子类的时候会调用

//什么作用:初始化类

+(void)initialize

{

}

(8)要设置模型中文字的颜色的时候,要通过设置它的文本属性才可以改变字体的颜色,(富文本:颜色,阴影,空心,图片,图文混排)

//什么时候调用:当程序一启动的时候就调用

//什么作用加载所有的类

+(void)load

{

//appearance:只要遵守UIAppearance 协议的都可以使用,比如 UIView

//设置UITabBarItem的外观标志

//appearance 在此处使用不严谨,获取整个项目中的类UITabBarItem 的外观标志

//appearanceWhenContainedIn:仅仅可以获取当前类的 UITabBarItem 的外观全局标志

UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil];

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

dic[NSForegroundColorAttributeName] = [UIColor orangeColor];

[item setTitleTextAttributes:dic forState:UIControlStateSelected];

}

(9)使用id  与 instancetype 的区别

1.使用id 在以后的使用中可以使用所有的set,get方法 ,不能使用点语法

2. instancetype 可以自动识别调用它的类,并调整在该类中可以使用。

(10)要调整系统中TabBar 中子控件的位置的时候

1.自定义一个TabBar,还有要了解,显示所加载的子控件的位置是在viewWillAppear方法,但在所有加载完viewDidAppear 中,所加载的除了自己创建还有其他的控件。

(11)如何是tabBar 上的子控件

for (UIView *tabBarButton in self.subviews)

{

if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")])

{ }

}

额外的知识点:

-(BOOL) isKindOfClass: classObj(也可以通过是否有相似的字符:NSClassFromString(@“”)  是不是ObjClass 或则是它的子类)判断是否是这个类或者这个类的子类的实例

-(BOOL) isMemberOfClass: classObj 判断是否是这个类的成员

--(BOOL)respondsToSelector: classObj 是否响应指定的 类方法

--(BOOL)performSelector: classObj  对象调用指定的方法

--(BOOL)performSelector: classObj withObject :  对象调用指定的方法 ,传递参数

//[teacher isKindOfClass:[Teacher class]

-(BOOL) respondsToSelector: selector 判读实例是否有这样方法

//[teacher respondsToSelector: @selector( setName: )]

+(BOOL) instancesRespondToSelector:  判断类是否有这个方法。此方法是类方法,不能用在类的对象

//[Person instancesRespondToSelector: @selector(teach)]

(11)调整子控件的大小根背景图片一样大

1. self.plusBtn.bounds = CGRectMake(0, 0, self.plusBtn.currentBackgroundImage.size.width, self.plusBtn.currentBackgroundImage.size.height);

//sizeToFit 默认会根据背景图片,文字,或者 图片背景计算出最合适的位置。

2.【btn sizeOfFit】;

***************************************************************************************

二.自定义tabBar

1.影藏系统自带的tabBar

2.自定义一个tabBar视图

3.将用户自定义的按钮视图添加背景图片,(和选中的背景图片)

4.实现并列视图切换和选中图片的切换效果。

**********************************************************

//跳转时遇到自定义的TabBar 没有影藏时

1self.hidesBottomBarWhenPushed = YES;//这仅仅适用于系统的

2.先把自定义的TabBar 放到系统的TabBar上

3.将系统的TabBar 的子类隐藏掉

-(void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

//移除系统自带的TabBarButton隐藏

for (UIView *tabBarButton in self.tabBar.subviews) {

if ([tabBarButton  isKindOfClass:NSClassFromString(@"UITabBarButton")]) {

[tabBarButton removeFromSuperview];

}

}

}

***************************************************************************************

问题:

1.如何让只读的属性,转换可以赋值

可以利用KVC , 【 self  setValue:@“” forKeyPath:@“”]; self :代表的是哪一个类 ,forKeyPath:代表的是哪一个属性  setValue :要赋值的值

2.如何让图片和字体根据当前的位置调整

1.tabBar 上的自定义子控件 btn

[btn sizeOfFit];

***************************************************************************************

//创建XIB是遇到的问题

1.利用XIB创建视图控制器的时候,创建的类的类型要和XIB一样,将Class写上对应的视图控制器,还有要将控制器的View连线

2.把 AUto—的那个勾去掉

2.self = [super init];  [super init ]; 这是OC 中一向惯用的做法,主要是为了父类在初始化的过程中防止返回的对象不同于原先创建的。

3.苹果中继承UIView 的是 : 控件   继承 NSObject : 是模型  像 : tabBarItem 一样 继承NSObject 使用的是点语法 可以调用它的属性 ;模型是用来存储数据的,当改变模型的数据的时候,可以相应的改变控件的内容。

********************************************************************************************************************

//当导航条左边的按钮换成自定义的,则会失去滑动返回的效果

1.遵守UINavigationControllerDelegate 协议

2.设置代理

3.实现

3.1//将导航返回代理暂存(自定义一个Strong 的 id 属性)viewDidLoad中

_popDelegate = self.interactivePopGestureRecognizer.delegate;

3.2/控制器跳转完成的时候调用

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

if (viewController == self.viewControllers[0]) {//是根控制器的时候

self.interactivePopGestureRecognizer.delegate = _popDelegate;

}else{//不是根控制器的时候

//将滑动返回的代理清空,实现滑动返回

self.interactivePopGestureRecognizer.delegate = nil;

}

}

***************************************************************************************

//实现设置非根控制器上的导航左右两边的按钮设置

//设置导航条上的按钮

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

{

//设置导航栏的内容,只有调用Push时才会设置导航控制器的上的内容,所以在push的前面设置它的前提条件,不是根视图控制器才设置它的内容

if (self.viewControllers.count != 0) {//不是跟视图控制器

//设置导航栏的内容

//设置导航控制左右两边的按钮

//左边的按钮

//当设置的左边的返回按钮覆盖以后,不能实现滑动返回手势功能

viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside];

//右边的按钮

viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_more"] highImage:[UIImage imageNamed:@"navigationbar_more_highlighted"] target:self action:@selector(backToRoot) forControlEvents:UIControlEventTouchUpInside];

}

//    CZLog(@"%s",__func__);

[super pushViewController:viewController animated:animated];

}

-(void)backToPre

{

[self popViewControllerAnimated:YES];

}

-(void)backToRoot

{

[self popToRootViewControllerAnimated:YES];

}

**********************************************************

//设置导航上按钮的两张图片的 类方法

+ (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image highImage:(UIImage *)highImage target:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

{

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

[btn setBackgroundImage:image forState:UIControlStateNormal];

[btn setBackgroundImage:highImage forState:UIControlStateHighlighted];

[btn sizeToFit];

[btn addTarget:target action:action forControlEvents:controlEvents];

return [[UIBarButtonItem alloc]initWithCustomView:btn];

}

**********************************************************

//当跳转的时候,出现系统自带的tabBarItem 的时候,(单次还是多次跳转)

1.遵守协议UINavigationControllerDelegate,设置代理

2.实现方法

//控制器即将跳转的时候调用

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

//获取主窗口

UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;

//获取根控制器

UITabBarController *tabBarVC = (UITabBarController *)keyWindow.rootViewController;

//移除系统自带的tabBarItem,这个单次跳转,出现了系统自带的,可在ViewWillAppear 中实现清除 这种效果

for (UIView *subTabBarItem in tabBarVC.tabBar.subviews) {

if ([subTabBarItem isKindOfClass:NSClassFromString(@"UITabBarButton")]) {

[subTabBarItem removeFromSuperview];

}

}

}

***************************************************************************************

//注意点: tableView 与 collectionView 要加载内容记得加载在 contentView 上 ,不要加载在cell 上.

***************************************************************************************

////把昵称放到账号处,添加属性,直接取巧的归档,以后碰到的话相似的,以前有过归档的,你想保存一个属性,也可以类似的添加属性归档

***************************************************************************************

//业务思想:昵称可能会改变时,把昵称先保存起来,当每次请求昵称的时候直接赋值(因为已经获取了昵称的请求,所以不用比较,直接赋值,会更好)

***************************************************************************************

//平移动画的实现,实现以个Lable 导航控制的导航条下面下拉,过了2秒以后自动上升,移除

//显示最新的微博数

-(void)showNewStatusCount:(int)count

{

//判读当没有的时候直接不显示

if (count == 0) return;

CGFloat h = 35;

CGFloat x =  0;

CGFloat y =  CGRectGetMaxY(self.navigationController.navigationBar.frame) - h;

CGFloat w = self.view.width;

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x, y, w, h)];

label.text = [NSString stringWithFormat:@"最新的微博数为:%d",count];

label.textAlignment = NSTextAlignmentCenter;

label.textColor = [UIColor whiteColor];

label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]];

//插入导航控制器的导航条的下面

[self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar];

//将Lable下移

[UIView animateWithDuration:0.25 animations:^{

label.transform = CGAffineTransformMakeTranslation(0, h);

} completion:^(BOOL finished) {

//向上移动

[UIView animateWithDuration:0.25 delay:2 options:UIViewAnimationOptionCurveLinear animations:^{

//还原

label.transform = CGAffineTransformIdentity;

} completion:^(BOOL finished) {

[label removeFromSuperview];

}];

}];

}

***************************************************************************************

//重写set方法的时候,记得不可以计算子控件的Frame ,这会很耗费性能,每次调用都计算

时间: 2024-10-01 07:30:59

新浪微博项目中我学会的东西的相关文章

任正非:向谷歌学习,杀出一条血路(谷歌军团的编制不大,战斗力极强。任何产品都是架构第一。算法团队直接杀入到项目中去,一线既有算法又有数据,就容易突破,抽象的平台一定要有实践东西检验。蓝军不一定是有学历的。我们帮助他们在工作中完成学历教育)

IT之家1月22日消息 日前,华为心声社区公布了任正非在1月9日在杭州研究所业务汇报会上的讲话.在本次讲话中,任正非表示在软件工程能力提升上,我们最缺乏的是对宏观架构有清醒认识的人才.建立公司是一个架构:建立公司的利益体系也是一个架构:任何产品都是架构第一:软件重构一定要从宏观架构入手. 任正非强调,没有谁在限制我们的科研,我们也不要自己约束了自己,要敢于到贴近人才资源的地方进行研究活动,在每个研究所形成自己的技术要素,对行业发展形成牵引.要多和终端.外研所交流. 最后任正非表示,谷歌军团的编制

【新手总结】在.Net项目中使用Redis作为缓存服务

最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 Redis是一个开源的分布式NoSql数据库,可以用来做缓存服务.消息队列.数据存储等等,数据类型之丰富,效率之高,简直逆天!没有了解过的可以移步去问度娘~客户端之丰富,足可见它的社区有多强大: 其中C#的客户端就有这么多: 没错,我们的项目里也选择了最热门的StackExchange.Redis作

iOS开发之MVVM在项目中的应用

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说到架构设计和团队

Web开发中需要了解的东西

在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需要知道的?)里面给出的答案非常不错,所以,我翻译转载过来. 顺便说一下,StackExchange真是非常好,大家可以对同一个答案做贡献和修订,看看这个问题的修订过程你就知道了——专业的问答网站应该怎么去做.这就是我在这篇文章中也说过真正的用户体验是什么样的. 好了,下面是正文(我对原文做了一些批注

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其用不弊.大盈若冲,其用不穷.  <道德经-老子>最完满的东西,好似有残缺一样,但它的作用永远不会衰竭:最充盈的东西,好似是空虚一样,但是它的作用是不会穷尽的 Written In The Font 摘要: 异常处理概述 学习内容: 建议110: 提倡异常封装 建议111: 采用异常链传递异常 建议

Web开发中需要了解的东西【转载】

在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需要知道的?)里面给出的答案非常不错,所以,我翻译转载过来. 顺便说一下,StackExchange真是非常好,大家可以对同一个答案做贡献和修订,看看这个问题的修订过程你就知道了--专业的问答网站应该怎么去做.这就是我在这篇文章中也说过真正的用户体验是什么样的.好了,下面是正文(我对原文做了一些批注,

在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下. 谈起FCKeditor,相信没几个Web程序员不知道的吧.不过,官方已经停止了该产品的更新,其最新版是2.6.6,于2010年2月15日发布. 取代FCKeditor的产品叫CKEditor(Content And Knowledge Editor),与其说是对FCKeditor的升级,不如说是全新的一个产品.相比FCK

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

项目中常用的SQL语句

摘要: 对于像我一样的菜鸟级别人物来说,接触的项目比较少,平常做的那些练习,包括三层中,一般也只能用到增删改查,当然这些增删改查语句是学数据库语句的入门,在百度上搜索一大堆,w3cschool中帮助文档也可以查阅. 这里是把平常用的增删改做一个小小总结,对一些小小项目也是比较适用的 ,当然,好记性不如烂笔头吗,这个时代纸质版的笔记感觉很欠缺,因为想要看的时候,你得找到那本书,而且要翻翻在哪里,感觉很不方便.并且电子版 的随便copy之类的都可以. 常用的sql语句(增删改查) 1.增加.插入语句