iOS:寫一個好看的ActionSheet

寫在前面

本文后面附有github源碼,建議大家下載后對著源碼參看.本文實現(xiàn)比較簡單基礎,大家覺得好的話,勞駕github給顆星,哈哈??.

背景

在項目開發(fā)中,我們經常會遇到這么一種情況:app中某些原生控件滿足不了我們的需求,所以這時候我們需要自定義來讓控件具有自己公司產品的風格.在大公司中,有很多原生控件都是被封裝過的,這樣大家在用的時候直接用就好了.自定義控件其實是一件一勞永逸的事情,很好的體現(xiàn)了封裝思想.在做公司的項目中遇到一個經常遇到情況,用戶更換頭像彈出ActionSheet,但是設計效果和原生的又相差較大,所以我選擇自定義封裝,借這個需求,我簡述一下自定義控件的一個過程.首先看下效果圖:

樣式一:


樣式二:


樣式三:


系統(tǒng)自帶ActionSheet


其實個人感覺還是不錯的,無奈與設計師風格不同,所以咱就換唄...


開始前思考

1.實現(xiàn)actionSheet效果選用什么作為載體?

要實現(xiàn)ActionSheet樣式并不難,剛開始想來好幾種控件實現(xiàn)形式,比如可以用UIView結合UIButton來實現(xiàn),也可以用TableView這個最常用的表視圖來實現(xiàn).比較這兩者發(fā)現(xiàn),UITableView可以根據其代理實現(xiàn)不同數(shù)量的Sheet單元格,而且還有cell的selecte方法,對于每個sheet單元格的復雜樣式,我們還可以通過自定義cell來實現(xiàn),相比較Button不僅省去了動態(tài)創(chuàng)建Button數(shù)量的開銷,而且系統(tǒng)封裝性和可擴展性更好.所以選用tableView是一個比較好的選擇.

2.如何封裝提高復用性?

提高復用性這一步對于當前這個ActionSheet用TableView實現(xiàn)來說很簡單,因為UITableView系統(tǒng)本身就給我自帶了很多代理方法,通過代理方法我們可以控制創(chuàng)建Sheet的分區(qū)數(shù)量以及每個分區(qū)內sheet的單元格數(shù)量.

但是作為一個自定義控件,特別是github上好的一些第三方,不僅在功能上有很大的實用性,而且每個功能的使用上也是很簡便,對我們來說使用越簡單,說明封裝性越好,在這里我個人覺得復用性的東西就是在一些模塊高度封裝的基礎之上的多次代碼延伸,拿這個ActionSheet來說,我最終希望的是當別人看到我這個控件之后,只需要關心你自己的業(yè)務需求,比如需要創(chuàng)建什么樣式,需要創(chuàng)建多少個sheet單元格,關心這些就夠了,所以我暴露給你的就是對應的給你一個創(chuàng)建樣式,給你一個創(chuàng)建多少個的方法就可以了.當然這樣也有缺點,封裝性越好,別人再用的時候再去擴展性就越差,所以,在自定義一個控件的時候要盡可能多考慮到各種需求來提高你封裝的代碼適應性.

3.確定思路

使用UITableView+自定義Cell方式,根據TableView的不同代理方法控制ActionSheet的單元格數(shù)量以及頭部及尾部分區(qū)的樣式.

實現(xiàn)

1.創(chuàng)建TableView,在此我是將TableView添加在View上

2.實現(xiàn)TableView相關代理方法

3.自定義TableViewCell樣式,并實現(xiàn)不同ActionSheet風格

測試

這一步到不是有什么技術含量,我寫在這里也是為了還原實現(xiàn)這一個Demo的思路,但是這一步其實也很重要,因為測試之后才能知道自己的程序寫的怎么樣,是否可行,這一步直接會影響到后續(xù)的優(yōu)化.我關注的點是:

1.功能是否實現(xiàn)了?

2.使用起來是否簡單方便?

3.實現(xiàn)同樣的功能,是否有更好的方法?

4.不好的地方怎么優(yōu)化?

對以上關注的點來看,我當時寫完之后記錄是這樣的:

1.功能基本實現(xiàn),但是太單一,擴展性不高

2.使用起來不方便,初始化代碼復雜,實現(xiàn)功能點代碼過于分散

3.代碼邏輯有待改進,代碼復用性不強

4.UI處理比較粗糙

優(yōu)化

通過上述測試之后,我把遇到的問題都列出來,然后一一進行優(yōu)化.

1.功能單一,擴展性不高

通過上面的截圖能看出來,我希望這個ActionSheet可以自定義不同的樣式,比如頭部和底部字體大小,顏色,高度;單元格字體大小,顏色,背景顏色以及行高,還有單元格不同的樣式,是只需要文字還是需要圖標加文字.這些應當提供給用戶做更多的選擇.但是這些樣式并不是剛需,所以可以作為額外代碼配置.可以單獨設置某一項,也可以一項都不設置,那就會以默認樣式來展示.通過屬性方式提供給用戶配置更多樣式:


2.使用起來不方便,初始化代碼復雜,實現(xiàn)功能點代碼過于分散.

對于一個基本控件的初始化,蘋果API給了我們很好的實例,創(chuàng)建時我們最好把這個控件最基本的需求放在初始化方法里,比如創(chuàng)建一個view 我們可以使用

UIView *view = [[UIView alloc] init];

也可以使用

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

這兩種方法都是可以的,但是像TableView創(chuàng)建時,我們使用的

UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) style:(UITableViewStyle)]

這個方法會帶有一個style參數(shù),這時我們就可以很方便快速的創(chuàng)建一個tableView的實例,但是像tableView的backgroundColor這樣的參數(shù)我們就不會放在初始化方法里.對于一個ActionSheet的控件,我將標題,單元格標題,取消按鈕標題以及代理作為初始化方法需要的參數(shù),最終的初始化方法如下:


3.實現(xiàn)同樣的功能,是否有更好的方法?

這個問題可以通過實現(xiàn)過程中遇到的問題相結合說明,Demo中有一個設置圓角的屬性,通過設置圓角可以實現(xiàn)和蘋果官方提供的ActionSheet類似的風格,當時這個sheet單元格第一個和最后一個都是半邊圓角,但是中間沒有圓角的樣式,我想過要不要通過判斷樣式用背景圖片來實現(xiàn),但是仔細一想這樣還需要借助美工切圖,在性能差不多的情況下盡量不依賴美工實現(xiàn)我覺得比較可取,所以我又采用了使用貝塞爾曲線定向切圓角的方法來實現(xiàn).

總結

通過實現(xiàn)這一個ActionSheet,從剛開始想,到功能草草實現(xiàn)再到優(yōu)化,基本上涵蓋了我們自定義控件的一個流程,雖然這只是一個很簡單的Demo,但是即使我們去開發(fā)自己的SDK,過程也是類似的,我們平時大部分情況下往往忽略了優(yōu)化,其實優(yōu)化這一步真的很重要,不單單是對你整個思路的一個整合提高,更是減少了我們后續(xù)改Bug的幾率.

尾巴

之前在簡書上看到了很多有關技術的文章,大家對技術文章的評論也都是褒貶不一,有的文章寫的很好,大家都大肆贊揚,有的文章寫的很初級,都覺得沒有什么價值.這都對,但是我覺得出發(fā)點是好的,希望能將自己的心得與大家分享,也希望能聽聽大家的高見,最重要的是希望自己能進步,能與大家一起進步,從一個菜鳥變成大神,希望大家都能成為一名開發(fā)工程師而不是單單的做一名碼農.

Demo鏈接:自定義一個好看的ActionSheet

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吏祸,一起剝皮案震驚了整個濱河市端姚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡刊侯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門锉走,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滨彻,“玉大人,你說我怎么就攤上這事挪蹭⊥ざ” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵梁厉,是天一觀的道長辜羊。 經常有香客問我,道長,這世上最難降的妖魔是什么八秃? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任庇麦,我火速辦了婚禮,結果婚禮上喜德,老公的妹妹穿的比我還像新娘。我一直安慰自己垮媒,他們只是感情好舍悯,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睡雇,像睡著了一般萌衬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上它抱,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天秕豫,我揣著相機與錄音,去河邊找鬼观蓄。 笑死混移,一個胖子當著我的面吹牛,可吹牛的內容都是我干的侮穿。 我是一名探鬼主播歌径,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亲茅!你這毒婦竟也來了回铛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤克锣,失蹤者是張志新(化名)和其女友劉穎茵肃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭祟,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡验残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巾乳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胚膊。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖想鹰,靈堂內的尸體忽然破棺而出紊婉,到底是詐尸還是另有隱情,我是刑警寧澤辑舷,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布喻犁,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏肢础。R本人自食惡果不足惜还栓,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望传轰。 院中可真熱鬧剩盒,春花似錦、人聲如沸慨蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期贫。三九已至跟匆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間通砍,已是汗流浹背玛臂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留封孙,地道東北人迹冤。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像虎忌,于是被迫代替她去往敵國和親叁巨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容