前言
作為一個(gè)IOS程序員敛纲,閑的時(shí)候也想自己做一個(gè)app練練手,又苦于沒有UI設(shè)計(jì)剂癌,也沒有好的idea淤翔,所以只能先模仿別人的App了,但是也會(huì)遇到以下問題
**
①不知道怎么入手佩谷?怎么設(shè)計(jì)
**
**
②app中的素材旁壮、圖標(biāo)要自己找嗎、沒有UI妹子給你切圖怎么辦谐檀,
**
**
③沒有數(shù)據(jù)怎么辦抡谐?假數(shù)據(jù)也不會(huì)做怎么辦
**
**
④編寫程序中該注意些什么
**
** 以下就從上面的三點(diǎn)開始介紹**
Tips:一下均為我個(gè)人的見解,有疑問或者建議請(qǐng)告訴我
以我的高仿項(xiàng)目半糖App為例
**
**
一桐猬、不知道怎么入手麦撵?怎么設(shè)計(jì)
首先,整體瀏覽一下官方的半糖App,
上面幾張圖片分別對(duì)應(yīng)的是 首頁溃肪、廣場(chǎng)免胃、消息中心、個(gè)人中心乍惊,杜秸,rootViewController是 UITabBarController,以首頁為例
Tips:
- 1 整體上分為 兩大部分 headerView 和UICollectionView
- 2 每次點(diǎn)擊標(biāo)簽 "最新" "熱門"等,collectionView 都會(huì)滾動(dòng)到對(duì)應(yīng)標(biāo)簽的tableView中润绎,
collectionView結(jié)構(gòu)上來看就是這樣:
也就是 tableview 添加到collectionViewCell.contentView中顯示出來
headerView的結(jié)構(gòu)如下
這一部分組合的自由度較大撬碟,然后每個(gè)按鈕都設(shè)置不同tag,然后所有按鈕添加相同的方法莉撇,比如
- (void)clickCenterWithTag:(UIButton *)sender{
if(sender.tag == 按鈕tag值){
}
}
當(dāng)然也可以設(shè)置一個(gè)block回調(diào)呢蛤,參數(shù)為按鈕tag值,在ViewController中 給block賦值的時(shí)候棍郎,比如
headerView.clickCenterBlock = ^(Int tag){
//在這里進(jìn)行判斷其障,tag等于多少,進(jìn)行什么操作
}
還有通知涂佃、delegate等方法都可以励翼,就不一一細(xì)說了。辜荠。
之后的頁面沒有太過于復(fù)雜的結(jié)構(gòu)汽抚,對(duì)照首頁,也可以一一將View剝離出來
**
**
二伯病、app中的素材造烁、圖標(biāo)要自己找嗎、沒有UI妹子給你切圖怎么辦
① app中好多按鈕的圖標(biāo)、背景圖片哪里找
大招:電腦上在iTunes中下載你要模仿的app惭蟋,找到它的存儲(chǔ)目錄(具體方法百度苗桂。)
接著,把 后綴.ipa 改為.zip ,然后把 zip文件打開
顯示包內(nèi)容后告组,可以看到大部分你所需要的素材圖片了
② 切圖標(biāo)注問題(切圖我就不說了煤伟,我只會(huì)截圖,ps什么的都不會(huì))
手機(jī)安裝你要模仿的app惹谐,然后截屏持偏,把圖片發(fā)到電腦上,然后安裝Mark Man工具氨肌,
鸿秆,然后將圖片拖到Mark Man中,
然后就可以隨心所欲地標(biāo)注怎囚,取色等等
**
**
三卿叽、沒有數(shù)據(jù)怎么辦?該怎么去抓包
沒有數(shù)據(jù)有兩個(gè)方法:
① 做假數(shù)據(jù)恳守,數(shù)據(jù)寫死考婴,這個(gè)不是很現(xiàn)實(shí),因?yàn)槟阋7碌腶pp肯定有圖片催烘,這么做假數(shù)據(jù)得到猴年馬月沥阱。。伊群。
② 抓包考杉,其實(shí)過程不是很繁瑣
下面講一下抓包的過程:
* 1 工具
Charles 百度上很多可以下載,試用版即可舰始,不需要破解
使用過程:
①將手機(jī)和電腦連上同一個(gè)wifi崇棠,打開抓包工具
②打開半糖app
抓到半糖app的數(shù)據(jù),點(diǎn)進(jìn)去如下:
這就是半糖app的數(shù)據(jù)丸卷,如果沒有你想要的枕稀,別急,你先瀏覽你要抓數(shù)據(jù)的頁面谜嫉,這時(shí)候會(huì)發(fā)現(xiàn)這個(gè)目錄有新的數(shù)據(jù)返回萎坷,點(diǎn)進(jìn)去可以看到
點(diǎn)擊 JavaScript按鈕可以看到原始的json數(shù)據(jù)
,
將json數(shù)據(jù) 拷貝到文件中存儲(chǔ)起來沐兰,這就是本地?cái)?shù)據(jù)
②下面說一下 如何解析數(shù)據(jù)哆档,以swift為例,OC類似參考一下僧鲁。
比如我們將剛剛的json存為 test.rtf(別問我為什么是rtf虐呻,因?yàn)閙ac上記事本只有這么一個(gè),當(dāng)然你也可以存為txt格式等),然后把test.rtf拖到項(xiàng)目中來
上代碼:
Tips: 在這里寞秃,我們首先要明白一點(diǎn)斟叼,字典即為對(duì)象的一種表現(xiàn)形式。
先把模型寫好:
class TopicModel: NSObject {
//先寫兩個(gè)屬性
var id: String?
var title: String?
//從json中讀取數(shù)據(jù) 并給model賦值(以下為Swift代碼春寿,OC請(qǐng)參考)朗涩,封裝成類方法更方便
class fun readDataFromJSON() -> TopicModel{
//創(chuàng)建返回的model
let topicModel = TopicModel()
//讀取JSON文件
let path = NSBundle.mainBundle().pathForResource("test", ofType: "rtf")
let nsData = NSData(contentsOfFile: path!)
/// json整體轉(zhuǎn)換為字典
let Dict = ( try! NSJSONSerialization.JSONObjectWithData(nsData!, options:.AllowFragments) ) as! NSDictionary
//看上面的圖片中,你要抓得數(shù)據(jù)處于 四層目錄下绑改,一步一步來
//先把 "data"從json文件中 剝離出來
let Data = Dict.objectForKey("data") as! NSDictionary
//從Data 中把 "topic"數(shù)組剝離出來,由圖片可以看到 topic是一個(gè)數(shù)組 谢床,存了好多個(gè)相同類型的數(shù)據(jù)
let topicData = Data.objectForKey("topic") as! NSArray
//topic數(shù)據(jù)已經(jīng)獲取,我們先將第一個(gè)元素剝離出來厘线,
// 定義一個(gè)object對(duì)象,并轉(zhuǎn)換為字典類型
let obj = topicData[0] as! NSDictionary
// 現(xiàn)在將obj字典的值 賦給 我們定義的topicModel
topicModel.id = obj.objectForKey("id") as? String
topicModel.title = obj.objectForKey("title") as? String
//end: 到現(xiàn)在 給model賦值就可以了识腿,返回model即可
return topicModel
}
}
在需要用到model的地方,直接調(diào)用 Topic.readFromJSON 就會(huì)返回你要的model
**現(xiàn)在看來造壮,抓包并沒有我們想象中的繁瑣 **
四渡讼、編寫程序應(yīng)該注意什么
Tips: 這一部分只是參照我的經(jīng)驗(yàn)來看,如有建議或者意見請(qǐng)與我交流耳璧,望不吝賜教
① 代碼盡量要復(fù)用成箫,封裝控件前看看是否幾個(gè)控件相似,可以放到一起旨枯,比如:
這個(gè)是 廣場(chǎng)中的標(biāo)簽欄
這個(gè)是個(gè)人中心的標(biāo)簽欄
這個(gè)是清單詳情的標(biāo)簽欄
三個(gè)控件有不相同的地方蹬昌,比如標(biāo)簽中的分割線,上面的邊框攀隔,字體大小皂贩,但是,控件中的所有邏輯都一樣竞慢,這就夠了先紫,可以寫一個(gè)控件,加一些參數(shù)筹煮,比如說 是否顯示邊框遮精,frame大小,中間是否有分割線败潦,這樣做的話本冲,封裝一個(gè)控件就可以滿足 整個(gè)app中類似的控件
② 方法,或者稱之為函數(shù)劫扒,封裝也盡量放到一起檬洞,比如
app中有很多對(duì)圖片進(jìn)行的操作,諸如 放大沟饥,裁剪添怔,加邊框湾戳,可以這樣:
//將 這些方法都封裝為 類方法 ,OC中也就是 "+"方法
class ImageOperationCenter: NSObejct {
class func ScaleToFize(image: UIImage) -> UIImage {
//對(duì)圖片進(jìn)行裁剪處理广料,并返回
}
class func MakeScale(image: UIImage,scale: CGFloat) -> UIImage {
//對(duì)圖片進(jìn)行放大處理砾脑,并返回
}
}
Tips:如上,將對(duì)圖片的處理方法艾杏,都放在 ImageOperationCenter
這個(gè)類中韧衣,調(diào)用的時(shí)候只需要像這樣 let image = ImageOperationCenter.MakeScale(源照片,放大倍數(shù))
即可购桑,用著也方便
③ 與第一點(diǎn)類似畅铭,很多相似的控件,Cell盡量復(fù)用
諸如
半糖精選的cell 與 用戶推薦的cell 類似勃蜘,但是有不同的地方硕噩,而且用到的model也不同,這樣我們就要重寫兩種cell嗎缭贡,不需要榴徐,只要 "用戶推薦"的cell 繼承 "半糖精選" 的cell,重寫里面的方法即可匀归,省了好多功夫坑资,所以寫程序一定要在不損失質(zhì)量的前提下怎么省事怎么來
再來看一個(gè)例子。
這個(gè)通常會(huì)將它作為collectionView
處理穆端,其實(shí)袱贮,只有8個(gè)button的情況下,將button封裝為一個(gè)View即可体啰,這樣攒巍,ViewController
中會(huì)少了一堆代理方法和一堆初始化collectionView方法
這個(gè)也就因人而異吧,要靈活運(yùn)用哦~
⑤ 其實(shí)看到一個(gè)頁面要先把整個(gè)頁面的結(jié)構(gòu)確定好荒勇,不要寫了一半才發(fā)現(xiàn)這樣寫好像太麻煩柒莉,或者這樣寫寫不出來
我在我的高仿半糖app中 首頁就遇到了這樣的問題,開始想著 用UIScrollView
當(dāng)做容器沽翔,里面添加UITableView
顯示內(nèi)容兢孝,這樣做未嘗不可,但是考慮到復(fù)用的問題仅偎,可以用三個(gè)tableView完成復(fù)用跨蟹,但是這樣做過于麻煩,所以后來就用collectionView當(dāng)做容器橘沥,將tableView 添加到collectionViewCell中顯示出來窗轩,這樣復(fù)用的問題就解決了
寫在后面的話
我的開發(fā)經(jīng)驗(yàn)也不多,上面完全是我在做項(xiàng)目中自己的感悟和體會(huì)座咆,有些可能會(huì)有問題痢艺,請(qǐng)參考即可