iOS開發(fā)一個(gè)好看的ActionSheet
背景
在項(xiàng)目開發(fā)中,我們經(jīng)常會(huì)遇到這么一種情況:App中某些原生控件滿足不了我們的需求,所以這時(shí)候我們需要自定義來讓控件具有自己公司產(chǎn)品的風(fēng)格.在大公司中,有很多原生控件都是被封裝過的,這樣大家在用的時(shí)候直接用就好了.自定義控件其實(shí)是一件一勞永逸的事情,很好的體現(xiàn)了封裝思想.在做公司的項(xiàng)目中遇到一個(gè)經(jīng)常遇到情況,用戶更換頭像彈出ActionSheet,但是設(shè)計(jì)效果和原生的又相差較大,所以我選擇自定義封裝,借這個(gè)需求,我簡述一下自定義控件的一個(gè)過程.首先看下效果圖:
樣式一:
樣式二:
樣式三:
系統(tǒng)自帶ActionSheet
其實(shí)個(gè)人感覺還是不錯(cuò)的,無奈與設(shè)計(jì)師風(fēng)格不同,所以咱就換唄...
開始前思考
1.實(shí)現(xiàn)actionSheet效果選用什么作為載體?
要實(shí)現(xiàn)ActionSheet樣式并不難,剛開始想來好幾種控件實(shí)現(xiàn)形式,比如可以用UIView結(jié)合UIButton來實(shí)現(xiàn),也可以用TableView這個(gè)最常用的表視圖來實(shí)現(xiàn).比較這兩者發(fā)現(xiàn),UITableView可以根據(jù)其代理實(shí)現(xiàn)不同數(shù)量的Sheet單元格,而且還有cell的selecte方法,對于每個(gè)sheet單元格的復(fù)雜樣式,我們還可以通過自定義cell來實(shí)現(xiàn),相比較Button不僅省去了動(dòng)態(tài)創(chuàng)建Button數(shù)量的開銷,而且系統(tǒng)封裝性和可擴(kuò)展性更好.所以選用tableView是一個(gè)比較好的選擇.
2.如何封裝提高復(fù)用性?
提高復(fù)用性這一步對于當(dāng)前這個(gè)ActionSheet用TableView實(shí)現(xiàn)來說很簡單,因?yàn)閁ITableView系統(tǒng)本身就給我自帶了很多代理方法,通過代理方法我們可以控制創(chuàng)建Sheet的分區(qū)數(shù)量以及每個(gè)分區(qū)內(nèi)sheet的單元格數(shù)量.
但是作為一個(gè)自定義控件,特別是github上好的一些第三方,不僅在功能上有很大的實(shí)用性,而且每個(gè)功能的使用上也是很簡便,對我們來說使用越簡單,說明封裝性越好,在這里我個(gè)人覺得復(fù)用性的東西就是在一些模塊高度封裝的基礎(chǔ)之上的多次代碼延伸,拿這個(gè)ActionSheet來說,我最終希望的是當(dāng)別人看到我這個(gè)控件之后,只需要關(guān)心你自己的業(yè)務(wù)需求,比如需要?jiǎng)?chuàng)建什么樣式,需要?jiǎng)?chuàng)建多少個(gè)sheet單元格,關(guān)心這些就夠了,所以我暴露給你的就是對應(yīng)的給你一個(gè)創(chuàng)建樣式,給你一個(gè)創(chuàng)建多少個(gè)的方法就可以了.當(dāng)然這樣也有缺點(diǎn),封裝性越好,別人再用的時(shí)候再去擴(kuò)展性就越差,所以,在自定義一個(gè)控件的時(shí)候要盡可能多考慮到各種需求來提高你封裝的代碼適應(yīng)性.
3.確定思路
使用UITableView+自定義Cell方式,根據(jù)TableView的不同代理方法控制ActionSheet的單元格數(shù)量以及頭部及尾部分區(qū)的樣式.
實(shí)現(xiàn)
創(chuàng)建TableView,在此我是將TableView添加在View上
實(shí)現(xiàn)TableView相關(guān)代理方法
自定義TableViewCell樣式,并實(shí)現(xiàn)不同ActionSheet風(fēng)格
測試
這一步到不是有什么技術(shù)含量,我寫在這里也是為了還原實(shí)現(xiàn)這一個(gè)Demo的思路,但是這一步其實(shí)也很重要,因?yàn)闇y試之后才能知道自己的程序?qū)懙脑趺礃?是否可行,這一步直接會(huì)影響到后續(xù)的優(yōu)化.我關(guān)注的點(diǎn)是:
- 功能是否實(shí)現(xiàn)了?
- 使用起來是否簡單方便?
- 實(shí)現(xiàn)同樣的功能,是否有更好的方法?
- 不好的地方怎么優(yōu)化?
對以上關(guān)注的點(diǎn)來看,我當(dāng)時(shí)寫完之后記錄是這樣的:
- 功能基本實(shí)現(xiàn),但是太單一,擴(kuò)展性不高
- 使用起來不方便,初始化代碼復(fù)雜,實(shí)現(xiàn)功能點(diǎn)代碼過于分散
- 代碼邏輯有待改進(jìn),代碼復(fù)用性不強(qiáng)
- UI處理比較粗糙
優(yōu)化
通過上述測試之后,我把遇到的問題都列出來,然后一一進(jìn)行優(yōu)化.
1.功能單一,擴(kuò)展性不高
通過上面的截圖能看出來,我希望這個(gè)ActionSheet可以自定義不同的樣式,比如頭部和底部字體大小,顏色,高度;單元格字體大小,顏色,背景顏色以及行高,還有單元格不同的樣式,是只需要文字還是需要圖標(biāo)加文字.這些應(yīng)當(dāng)提供給用戶做更多的選擇.但是這些樣式并不是剛需,所以可以作為額外代碼配置.可以單獨(dú)設(shè)置某一項(xiàng),也可以一項(xiàng)都不設(shè)置,那就會(huì)以默認(rèn)樣式來展示.通過屬性方式提供給用戶配置更多樣式:
2.使用起來不方便,初始化代碼復(fù)雜,實(shí)現(xiàn)功能點(diǎn)代碼過于分散.
對于一個(gè)基本控件的初始化,蘋果API給了我們很好的實(shí)例,創(chuàng)建時(shí)我們最好把這個(gè)控件最基本的需求放在初始化方法里,比如創(chuàng)建一個(gè)view 我們可以使用
UIView *view = [[UIView alloc] init];
也可以使用
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
這兩種方法都是可以的,但是像TableView創(chuàng)建時(shí),我們使用的
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) style:(UITableViewStyle)]
這個(gè)方法會(huì)帶有一個(gè)style參數(shù),這時(shí)我們就可以很方便快速的創(chuàng)建一個(gè)tableView的實(shí)例,但是像tableView的backgroundColor這樣的參數(shù)我們就不會(huì)放在初始化方法里.對于一個(gè)ActionSheet的控件,我將標(biāo)題,單元格標(biāo)題,取消按鈕標(biāo)題以及代理作為初始化方法需要的參數(shù),最終的初始化方法如下:
3.實(shí)現(xiàn)同樣的功能,是否有更好的方法?
這個(gè)問題可以通過實(shí)現(xiàn)過程中遇到的問題相結(jié)合說明,Demo中有一個(gè)設(shè)置圓角的屬性,通過設(shè)置圓角可以實(shí)現(xiàn)和蘋果官方提供的ActionSheet類似的風(fēng)格,當(dāng)時(shí)這個(gè)sheet單元格第一個(gè)和最后一個(gè)都是半邊圓角,但是中間沒有圓角的樣式,我想過要不要通過判斷樣式用背景圖片來實(shí)現(xiàn),但是仔細(xì)一想這樣還需要借助美工切圖,在性能差不多的情況下盡量不依賴美工實(shí)現(xiàn)我覺得比較可取,所以我又采用了使用貝塞爾曲線定向切圓角的方法來實(shí)現(xiàn).
總結(jié)
通過實(shí)現(xiàn)這一個(gè)ActionSheet,從剛開始想,到功能草草實(shí)現(xiàn)再到優(yōu)化,基本上涵蓋了我們自定義控件的一個(gè)流程,雖然這只是一個(gè)很簡單的Demo,但是即使我們?nèi)ラ_發(fā)自己的SDK,過程也是類似的,我們平時(shí)大部分情況下往往忽略了優(yōu)化,其實(shí)優(yōu)化這一步真的很重要,不單單是對你整個(gè)思路的一個(gè)整合提高,更是減少了我們后續(xù)改Bug的幾率.
尾巴
之前在簡書上看到了很多有關(guān)技術(shù)的文章,大家對技術(shù)文章的評論也都是褒貶不一,有的文章寫的很好,大家都大肆贊揚(yáng),有的文章寫的很初級,都覺得沒有什么價(jià)值.這都對,但是我覺得出發(fā)點(diǎn)是好的,希望能將自己的心得與大家分享,也希望能聽聽大家的高見,最重要的是希望自己能進(jìn)步,能與大家一起進(jìn)步,從一個(gè)菜鳥變成大神,希望大家都能成為一名開發(fā)工程師而不是單單的做一名碼農(nóng).
Demo鏈接:
相關(guān)文章
iOS實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)
這篇文章主要介紹了iOS實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能,一種方法是利用NSTimer計(jì)時(shí)器,另一種方法是利用GCD實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12IOS中用正則表達(dá)式判斷輸入的內(nèi)容為8-16位且同時(shí)包含數(shù)字和字母
這篇文章主要介紹了IOS中用正則表達(dá)式判斷輸入的內(nèi)容為8-16位且同時(shí)包含數(shù)字和字母,需要的朋友可以參考下2017-06-06Ios蘋果app應(yīng)用程序開發(fā)者如何獲取IPA簽名證書詳解
這篇文章主要為大家介紹了Ios蘋果app應(yīng)用程序開發(fā)者如何獲取IPA簽名證書詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11iOS多線程應(yīng)用開發(fā)中使用NSOperation類的基本方法
這篇文章主要介紹了iOS多線程應(yīng)用開發(fā)中使用NSOperation類的基本方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11iOS App開發(fā)中使用及自定義UITableViewCell的教程
這篇文章主要介紹了iOS App開發(fā)中使用及自定義UITableViewCell的教程,自定義TableViewCell文中使用Objective-C演示而非ib,需要的朋友可以參考下2016-04-04