项目地址:Github:YTWeathergit
距离毕业也有3、四个月的时间了,除了工做上的内容,改一改旧的Bug,作一作新的内容,还一直想着要作一个本身独立完成的应用。作即时通信吧没有服务器,作音乐播放器吧没有数据库,因此就从最简单的只须要一个接口就能搞定的天气应用开始喽。这不,一款乱七八糟、为所欲为的Weather Application就出来了。感谢小伙伴Chaylau的协做完成。程序员
“油条天气”是一款基于iOS平台的天气应用。YT可以作到显示基本的天气信息,包括城市、当前时间、实时天气状况、七每天气预报、当天24小时天气预报,也可以自由添加国内
城市,只须要输入城市名便可。 github
油条天气涵盖了城市信息、当前时间、七每天气预报、一天内24小时天气预报、广告位、当前详细天气信息、降水量信息、太阳和风速信息等基础天气咨询。还具备自定义添加国内城市、多城市切换的功能。一些界面截图以下: 数据库
获取数据的接口选取的是 和风天气 ,针对普通开发者能够免费获取7天/24小时的天气预报,天天可以链接接口大约15000次。数组
只须要登陆 和风天气 官网注册成为开发者并稍做认证,便可得到Key在应用内使用,在官网控制台内还能查看每日接口被获取的详细数量。缓存
固然,免费的接口只能获取一部分天气信息,而且只能支持国内的城市。想要体验更多的天气信息,则必须购买相应功能的接口。 bash
程序员的工做是安安心心的写代码,总不能期望咱们Sketch
、Axure
、PhotoShop
样样精通吧......可是一款好看的App又很依赖于UI设计,因此咱们偷懒将 Yahoo天气 进行了解包,调取了他们的UI切图啥了的,界面设计也仿照了 Yahoo天气 。因此UI方面的工做就比较轻松,直接拖入Assets
包里就行。(不做商业用途,此处如被认定有侵权,将会马上删除。)服务器
解包操做:下载PP助手(以前能够直接在iTunes中下载ipa
包的,可是苹果关闭了这项功能,因此用PP助手),在PP助手上将Yahoo天气的ipa
包下载到mac
中,再用 Github:Cartool 进行获取Assets操做,具体操做可参考 提取assets.car中的图片 .car文件的解压 。 网络
开始动手码代码以前固然是对程序的框架进行搭建,参考公司其余项目的结构,选用了传统的MVC框架,思惟导图以下: app
APP复杂度并不高,也不依赖于NavigationController
和TabBarController
,因此一个主控制器负责全部界面的展现、子控制器的跳转。将视图的展现集合到MainView
里,MainController
只负责逻辑部分,减轻M-V-C中C的负担。
MainView
从底往上依次是:LeftSlideView
-MaskView
-ScrollView
-TableView
-CustomNavigationBar
。在处理ScrollView
时花了很多功夫,既要保证当前城市所在View
的滑动,还要保证其余View
跟随滑动,在切换或搜索城市事后还要添加相应的索引。
- Q:Cell如何实现悬浮效果?
A:将Cell背景设为透明色,在每一个Cell的上先加入一层BackgroudView,到左右两边同时设置约束,加圆角,改变BackgroundView的颜色和透明度,实现悬浮效果。
- Q:WeatherCode和CityCode都是以.txt形式给出,如何转为.plist? A:在网上看了许多博客和教程,最后决定用笨办法转换,因为不一样txt中内容格式不固定,因此手动粘贴了txt文件中的项。从此准备将转换方法实现自动化,自动去判别txt中的内容,并根据内容完成转换,如下是转换方法的代码。
- (void)txtConvertToPlist
{
// 将txt文件添加进项目文件中
// 获取txt文件的路径
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"condition-code" ofType:@"txt"];
// 将txt文件转换为String类型
NSString *pathString = [[NSString alloc] initWithContentsOfFile:plistPath encoding:NSUTF8StringEncoding error:nil];
// 将每行拆分,存入数组
NSArray *bigArray = [pathString componentsSeparatedByString:@"\n"];
NSMutableArray *resultArray = [NSMutableArray array];
for (int i=1; i<ary.count-1; i++) {
// 根据空格拆分每列,存入字典
NSArray *smallAry = [bigArray[i] componentsSeparatedByString:@" "];
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:smallAry[0] forKey:@"cityCode"];
[dic setObject:smallAry[1] forKey:@"cityEnglishName"];
[dic setObject:smallAry[2] forKey:@"cityChineseName"];
[resultArray addObject:dic];
}
// 存入.plist
NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
NSString *fileName = [plistPath stringByAppendingPathComponent:@"cityCode.plist"];
NSFileManager *fm = [NSFileManager defaultManager];
if ([fm createFileAtPath:fileName contents:nil attributes:nil] ==YES) {
[resultAry writeToFile:fileName atomically:YES];
NSLog(@"文件写入完成");
}
}
复制代码
- Q:Cell如何实现悬浮效果?
A:一个Controller中置入多个页面的时候,一定要考虑清楚其之间的层级关系。LeftSlideView在最底层,可以让用户在点击菜单栏按钮时将ScrollView总体右移;MaskView是为了处理交互,在菜单栏未弹出时透明度为1,看上去ScrollView就像是最底层了,菜单栏弹出时,将透明度慢慢更改成0,使LeftSlideView浮现出来;ScrollView上的每一个View表现形式都相同(从此会考虑View的复用问题),下图为层级关系示意图。![]()
- Q:Cell如何实现悬浮效果?
A:AFNetworking → 处理网络请求,数据获取; SDWebImage → 缓存天气图标; YYKit → 将JSON转为模型,比MJExtension更轻量级; MJRefresh → 下拉刷新的首选,在此基础上自定义了Gif方式的刷新。
“开发是小头、维护是大头”,来自一名弱鸡开发的真实感觉,虽然在项目开始前已经搭建了大体的框架,想好了编码的思路,可是越日后愈加现不少东西均可以用另外一种更好的方法实现,因此做为一枚新手iOS,复盘+优化+重构的总结之路还有好长要走,接下来总结一下项目里可以优化、可以略去以及可以还存在Bug的地方吧~
未完待续