項目地址: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的地方吧~
未完待續