Where?
專案地址:Github:YTWeather
Why do this?
距離畢業也有三、四個月的時間了,除了工作上的內容,改一改舊的Bug,做一做新的內容,還一直想著要做一個自己獨立完成的應用。做即時通訊吧沒有伺服器,做音樂播放器吧沒有資料庫,所以就從最簡單的只需要一個介面就能搞定的天氣應用開始嘍。這不,一款亂七八糟、隨心所欲的Weather Application就出來了。感謝小夥伴Chaylau的協作完成。
What's this?
“油條天氣”是一款基於iOS平臺的天氣應用。YT能夠做到顯示基本的天氣資訊,包括城市、當前時間、實時天氣情況、七天天氣預報、當天24小時天氣預報,也能夠自由新增國內
城市,只需要輸入城市名即可。
![油條天氣APP圖示](https://i.iter01.com/images/c8fc8dff7730106c3e4d8d32572b244347be0d4d15a04e0921c4668d3560aabb.png)
What're the features?
油條天氣涵蓋了城市資訊、當前時間、七天天氣預報、一天內24小時天氣預報、廣告位、當前詳細天氣資訊、降水量資訊、太陽和風速資訊等基礎天氣諮詢。還具有自定義新增國內城市、多城市切換的功能。一些介面截圖如下:
![APP螢幕截圖](https://i.iter01.com/images/168d1242a59db8c477bcba258c037aea6f6afffbf68809cc7a605c91a5aeb829.jpg)
What're the techniques?
-
介面
獲取資料的介面選取的是 和風天氣 ,針對普通開發者可以免費獲取7天/24小時的天氣預報,每天能夠連線介面大約15000次。
只需要登入 和風天氣 官網註冊成為開發者並稍作認證,即可獲得Key在應用內使用,在官網控制檯內還能檢視每日介面被獲取的詳細數量。
當然,免費的介面只能獲取一部分天氣資訊,並且只能支援國內的城市。想要體驗更多的天氣資訊,則必須購買相應功能的介面。
![和風天氣控制檯](https://i.iter01.com/images/8f904b3da89c6bc64fcafaf0db8320e8ef0cb8ce504fbac67386a37f33a4b6e2.png)
-
UI設計
程式設計師的工作是安安心心的寫程式碼,總不能指望我們Sketch
、Axure
、PhotoShop
樣樣精通吧......但是一款好看的App又很依賴於UI設計,所以我們偷懶將 Yahoo天氣 進行了解包,調取了他們的UI切圖啥了的,介面設計也仿照了 Yahoo天氣 。所以UI方面的工作就比較輕鬆,直接拖入Assets
包裡就行。(不作商業用途,此處如被認定有侵權,將會立刻刪除。)
解包操作:下載PP助手(之前可以直接在iTunes中下載ipa
包的,但是蘋果關閉了這項功能,所以用PP助手),在PP助手上將Yahoo天氣的ipa
包下載到mac
中,再用 Github:Cartool 進行獲取Assets操作,具體操作可參考 提取assets.car中的圖片 .car檔案的解壓 。
![獲取的UI檔案](https://i.iter01.com/images/a868d2f5a2facf73ab5f25215d8f0395f6212b5fa529de50311396005b3f7f77.png)
-
框架搭建
開始動手碼程式碼之前當然是對程式的框架進行搭建,參考公司其他專案的結構,選用了傳統的MVC框架,思維導圖如下:
![框架思維腦圖.png](https://i.iter01.com/images/ccee4d408d7c521b8d7591eaaa56a4666b10b9418bf10a39f77da479c92cb675.png)
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方式的重新整理。
What will we do next?
“開發是小頭、維護是大頭”,來自一名弱雞開發的真實感受,雖然在專案開始前已經搭建了大致的框架,想好了編碼的思路,但是越往後越發現很多東西都可以用另一種更好的方法實現,所以作為一枚新手iOS,覆盤+優化+重構的總結之路還有好長要走,接下來總結一下專案裡能夠優化、能夠略去以及能夠還存在Bug的地方吧~
未完待續
- 2018.1.24 發現clone很慢,刪除了assets中很多無用的圖片,重整了一下專案結構。
- 2018.3.10 適配iPhone X。
- 2018.3.15 新增定位功能,優化太陽和風速cell的動畫效果。