1.概述
? ? ?這次做一款短小精悍的賺錢app薄坏。產(chǎn)品一周的原型圖設(shè)計(jì)之后,周五下午開會(huì)(12月18日)缝龄,一番頭腦風(fēng)暴之后汰现,總監(jiān)一錘定音挂谍,請(qǐng)大伙兩周搞定它。心中一番心潮澎湃瞎饲,心想反正也不難口叙。周末過后,美好的周一開始嗅战,UI開始設(shè)計(jì)界面妄田,我仔細(xì)看了下原型圖,沒啥復(fù)雜界面仗哨,完全不用擔(dān)心了形庭,就讓UI好好設(shè)計(jì)吧,我這邊先搭個(gè)架構(gòu)(storyboard厌漂、工具類萨醒、第三方庫),再斗兩局地主苇倡,慢慢得等富纸。沒曾想,這次測(cè)試轉(zhuǎn)UI得浩哥這么給力(專職UI離職了)旨椒,一設(shè)計(jì)就是一周啊晓褪,服務(wù)端接口也還在設(shè)計(jì)階段,沒界面沒數(shù)據(jù)综慎,我寫什么涣仿,所以依舊淡定。又經(jīng)過一個(gè)美好的周末示惊,好港,
? ? 第二周開始,正式coding了米罚。過程可以忽略钧汹,基本還順利,敲代碼的時(shí)刻平靜又美好录择,就像談鋼琴一樣(我不會(huì))拔莱,看著我,左手隘竭、右手一個(gè)慢動(dòng)作塘秦,彈指間又一個(gè)類。然后元旦我們就加班到通宵三點(diǎn)了货裹,2016的元旦嗤形,是一個(gè)美好的夜晚。
2.架構(gòu) - DVVD與storyboard
對(duì)弧圆,是DVVD赋兵。不是MVVM笔咽。D是dictionary,因?yàn)槲覜]有封裝Model霹期,總覺得封裝太麻煩叶组。后來事實(shí)證明我錯(cuò)了,以后一定封裝历造。之前controller里最高出現(xiàn)過七八百行代碼(這是個(gè)例外甩十,因?yàn)槭欠庋bSDK,只能一個(gè)類)吭产,看得頭暈?zāi)X脹侣监,兩眼昏花,后來網(wǎng)上看到MVVM臣淤,名字好高大上橄霉,我沒有用Model,那就叫DVVD吧邑蒋。
做了兩層ViewModel姓蜂,BaseViewModel和MainViewModel、LoginViewModel医吊。兩個(gè)model分別處理主頁面和登陸頁面的網(wǎng)絡(luò)請(qǐng)求钱慢、數(shù)據(jù)處理、邏輯判斷等卿堂。
UI方面束莫,使用storyBoard+xib(無autoLayout)+結(jié)合代碼調(diào)整。各首頁面的控制器均在storyBoard中草描,沒使用用autoLayout麦箍,storyboard和xib中只負(fù)責(zé)初始化view,以size為4.7寸屏幕搭建界面陶珠,具體適配工作,用代碼實(shí)現(xiàn)享钞。代碼中揍诽,根據(jù)各屏幕的寬高比相同,計(jì)算當(dāng)前屏幕的寬高與iphone6屏幕寬高的比值栗竖,根據(jù)該比值計(jì)算控件當(dāng)前的合理frame暑脆,從而修改frame星压。此方法封裝到工具類中即可康谆。
3.項(xiàng)目問題
項(xiàng)目雖然不大椎镣,小問題不少险掀,整理一下問題及解決方案呵萨。
3.1關(guān)于布局-靈活使用
自從使用過storyBoard之后,就比較喜歡這種布局方式了脑豹,并且也是蘋果官方推薦的方式坐慰。之前都是storyboard+autolayout的,這次搭建登錄注冊(cè)模塊時(shí)鲤孵,由于好多約束寫死的壶栋,在在小屏幕上很不成比例,還有一些imageview上圖片變形嚴(yán)重普监,網(wǎng)上查了下解決方案贵试,看到這位大神的方案,(storyboard無autolayout適配)?凯正,實(shí)驗(yàn)了一下效果不錯(cuò)毙玻,遂采用此方案。
另外就是布局要靈活廊散,如果一個(gè)頁面上要排布很多button桑滩,那么一個(gè)個(gè)拖到xib中,再一個(gè)個(gè)改frame奸汇,顯然很沒有效率施符,這個(gè)時(shí)候就可以結(jié)合代碼來實(shí)現(xiàn)了,將一些相似重復(fù)的布局工作放到代碼里也會(huì)大大提高工作效率擂找。
storyboard的粘貼戳吝,很多相似的布局可以粘貼使用,可以先打開storyboard的source code贯涎。
3.2鍵盤適配-放在基類
在注冊(cè)登錄頁面會(huì)遇到鍵盤遮擋問題听哭,在每個(gè)界面都添加監(jiān)聽事件重復(fù)性很大,放在基類中會(huì)大大提高效率塘雳。
可以再基類中添加監(jiān)聽鍵盤顯示與消失的通知事件陆盘,收到通知后獲取動(dòng)畫時(shí)間、與鍵盤的高度败明,傳給子類隘马,在子類中拿到所需數(shù)據(jù),傳給一個(gè)鍵盤manager處理妻顶。
注意的是記得移除通知酸员,viewWillDisappear中移除,放在dealloc中會(huì)有問題讳嘱,由于所有的子類都實(shí)現(xiàn)了父類的鍵盤通知方法幔嗦,當(dāng)鍵盤通知發(fā)生時(shí),所有的未dealloc子類都會(huì)實(shí)現(xiàn)該方法沥潭。
另外邀泉,鍵盤的UIKeyboardWillShowNotification會(huì)執(zhí)行四次,分別對(duì)應(yīng)于鍵盤顯示一大半以及鍵盤完全顯示時(shí),所以計(jì)算時(shí)要將計(jì)算的高度差除以2汇恤。
3.3友盟分享與統(tǒng)計(jì)
友盟用習(xí)慣了庞钢,分享功能還是很好用的。
將分享的代碼封裝起來屁置,提供分享到QQ焊夸、weChat、sina的接口即可蓝角。遇到一個(gè)bug是分享到qq時(shí)阱穗,本地圖片+標(biāo)題+文本+鏈接,當(dāng)圖片不存在時(shí)使鹅,就只剩文本了揪阶。
sina分享使用的微博非原生sdk,使用原生還是分享不了患朱,不清楚為啥鲁僚。記得實(shí)現(xiàn)一個(gè)delegate。(didSelectSocialPlatform)裁厅,調(diào)用分享面板冰沙,設(shè)置分享里的鏈接。
統(tǒng)計(jì)可以將相關(guān)代碼放在基類中执虹,如何設(shè)置page參數(shù)拓挥,知道是哪個(gè)頁面,使用runtime;
[MobClick beginLogPageView:[NSString stringWithFormat:@"%s", object_getClassName(self)]];
[MobClick endLogPageView:[NSString stringWithFormat:@"%s", object_getClassName(self)]];
3.4 提高開發(fā)效率?
重復(fù)的工作少做袋励,提高代碼邏輯侥啤,都可以大大提高開發(fā)效率。
1>布局方面茬故,靈活一些盖灸,該用代碼就用代碼。
2>使用一些xcode小插件磺芭。獲取圖片的赁炎,注釋的等等
3>.布局添加約束時(shí)花費(fèi)了大量的時(shí)間,現(xiàn)在使用storyboard+代碼钾腺,速度提高不少甘邀。
3.5 代碼邏輯
這大概是區(qū)分ios水平高低的標(biāo)準(zhǔn)之一,優(yōu)秀的代碼的代碼邏輯是很清晰的垮庐。總結(jié)一下目前所能提高代碼邏輯的方法:
1>.合理的封裝坞琴。所謂少而精哨查,多則亂。將重復(fù)代碼放到基類中剧辐,會(huì)大大提高代碼清晰度寒亥。
2>.減少if else邮府。大量的if else,看一會(huì)兒就暈掉了溉奕。改用switch 就用switch褂傀,合理使用return,考慮使用reactive cocoa框架加勤,還沒學(xué)會(huì)仙辟。
3>.良好的框架。小項(xiàng)目使用MVVM已經(jīng)很清晰了鳄梅,可能會(huì)造成viewModel很龐大叠国,還可以有更深入的封裝,簡(jiǎn)化viewModel層的代碼戴尸∷诤福可以參看這篇文章,繼續(xù)簡(jiǎn)化操作孙蒙。(猿題庫 iOS 客戶端架構(gòu)設(shè)計(jì))项棠。
4.總結(jié)
先寫到這兒,想到再加上挎峦。稍后香追,相關(guān)代碼會(huì)提交到Github中,期待與各大神分享交流浑测。
引用文章:
1.猿題庫 iOS 客戶端架構(gòu)設(shè)計(jì)