iOS仿照Yahoo天气:油条天气

Where?

  项目地址:Github:YTWeathergit

Why do this?

  距离毕业也有3、四个月的时间了,除了工做上的内容,改一改旧的Bug,作一作新的内容,还一直想着要作一个本身独立完成的应用。作即时通信吧没有服务器,作音乐播放器吧没有数据库,因此就从最简单的只须要一个接口就能搞定的天气应用开始喽。这不,一款乱七八糟、为所欲为的Weather Application就出来了。感谢小伙伴Chaylau的协做完成。程序员

What's this?

  “油条天气”是一款基于iOS平台的天气应用。YT可以作到显示基本的天气信息,包括城市、当前时间、实时天气状况、七每天气预报、当天24小时天气预报,也可以自由添加国内城市,只须要输入城市名便可。 github

油条天气APP图标

What're the features?

  油条天气涵盖了城市信息、当前时间、七每天气预报、一天内24小时天气预报、广告位、当前详细天气信息、降水量信息、太阳和风速信息等基础天气咨询。还具备自定义添加国内城市、多城市切换的功能。一些界面截图以下: 数据库

APP屏幕截图

What're the techniques?

  • 接口

  获取数据的接口选取的是 和风天气 ,针对普通开发者能够免费获取7天/24小时的天气预报,天天可以链接接口大约15000次。数组

  只须要登陆 和风天气 官网注册成为开发者并稍做认证,便可得到Key在应用内使用,在官网控制台内还能查看每日接口被获取的详细数量。缓存

  固然,免费的接口只能获取一部分天气信息,而且只能支持国内的城市。想要体验更多的天气信息,则必须购买相应功能的接口。 bash

和风天气控制台

  • UI设计

  程序员的工做是安安心心的写代码,总不能期望咱们SketchAxurePhotoShop样样精通吧......可是一款好看的App又很依赖于UI设计,因此咱们偷懒将 Yahoo天气 进行了解包,调取了他们的UI切图啥了的,界面设计也仿照了 Yahoo天气 。因此UI方面的工做就比较轻松,直接拖入Assets包里就行。(不做商业用途,此处如被认定有侵权,将会马上删除。)服务器

  解包操做:下载PP助手(以前能够直接在iTunes中下载ipa包的,可是苹果关闭了这项功能,因此用PP助手),在PP助手上将Yahoo天气的ipa包下载到mac中,再用 Github:Cartool 进行获取Assets操做,具体操做可参考 提取assets.car中的图片 .car文件的解压网络

获取的UI文件

  • 框架搭建

  开始动手码代码以前固然是对程序的框架进行搭建,参考公司其余项目的结构,选用了传统的MVC框架,思惟导图以下: app

框架思惟脑图.png

  APP复杂度并不高,也不依赖于NavigationControllerTabBarController,因此一个主控制器负责全部界面的展现、子控制器的跳转。将视图的展现集合到MainView里,MainController只负责逻辑部分,减轻M-V-C中C的负担。

  MainView从底往上依次是:LeftSlideView-MaskView-ScrollView-TableView-CustomNavigationBar。在处理ScrollView时花了很多功夫,既要保证当前城市所在View的滑动,还要保证其余View跟随滑动,在切换或搜索城市事后还要添加相应的索引。

  • 项目中遇到的其余问题

  1. Q:Cell如何实现悬浮效果?
    A:将Cell背景设为透明色,在每一个Cell的上先加入一层BackgroudView,到左右两边同时设置约束,加圆角,改变BackgroundView的颜色和透明度,实现悬浮效果。
  1. 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(@"文件写入完成");
    }
}
复制代码
  1. Q:Cell如何实现悬浮效果?
    A:一个Controller中置入多个页面的时候,一定要考虑清楚其之间的层级关系。LeftSlideView在最底层,可以让用户在点击菜单栏按钮时将ScrollView总体右移;MaskView是为了处理交互,在菜单栏未弹出时透明度为1,看上去ScrollView就像是最底层了,菜单栏弹出时,将透明度慢慢更改成0,使LeftSlideView浮现出来;ScrollView上的每一个View表现形式都相同(从此会考虑View的复用问题),下图为层级关系示意图。
    层级关系.png
  1. Q:Cell如何实现悬浮效果?
    A:AFNetworking → 处理网络请求,数据获取;   SDWebImage → 缓存天气图标;   YYKit → 将JSON转为模型,比MJExtension更轻量级;   MJRefresh → 下拉刷新的首选,在此基础上自定义了Gif方式的刷新。

What will we do next?

  “开发是小头、维护是大头”,来自一名弱鸡开发的真实感觉,虽然在项目开始前已经搭建了大体的框架,想好了编码的思路,可是越日后愈加现不少东西均可以用另外一种更好的方法实现,因此做为一枚新手iOS,复盘+优化+重构的总结之路还有好长要走,接下来总结一下项目里可以优化、可以略去以及可以还存在Bug的地方吧~

未完待续

  • 2018.1.24 发现clone很慢,删除了assets中不少无用的图片,重整了一下项目结构。
  • 2018.3.10 适配iPhone X。
  • 2018.3.15 添加定位功能,优化太阳和风速cell的动画效果。
相关文章
相关标签/搜索