自定義按鈕的優(yōu)雅封裝 - Swift

目錄

1.自定義按鈕解決了什么問題
2.封裝思路與踩的坑
3.使用效果
4.源碼和demon地址


1.自定義按鈕解決了什么問題

  • 一行代碼設(shè)置圖片與文本位置(文本在圖片左邊/右邊/上面/下面)
  • 一行代碼設(shè)置圖片與文本間距
  • 一行代碼添加漸變色背景阻课,設(shè)置點(diǎn)擊高亮漸變色效果
  • 陰影意系、圓角、漸變色同時(shí)存在

解決以上問題我們僅僅使用系統(tǒng)按鈕去開發(fā)于微,需要寫很多代碼而且容易出bug,所以需要封裝一個(gè)按鈕達(dá)到一勞永逸的效果户辞。

2.封裝思路與踩的坑

1.封裝的按鈕是繼承UIButton還是繼承UIControl

剛開始寫是繼承UIButton狼钮,然而在insert漸變色layer時(shí),需要處理UIbutton的titleLabel和imageView的layer和漸變色layer的層級(jí)問題围橡,保證漸變色layer在最上面才能顯示漸變色,稍顯麻煩缕贡,高亮效果也不好翁授,而且感覺UIButton有點(diǎn)重,所以選擇繼承UIControl晾咪,寫一個(gè)全新的按鈕收擦。

2.圖片與文本位置樣式和間距

這個(gè)重寫layoutSubviews方法,在里面計(jì)算出合適的位置即可禀酱,但是調(diào)用時(shí)機(jī)需要考慮全面一點(diǎn)炬守,比如文本改動(dòng),文本字體改動(dòng)剂跟,圖片改動(dòng)减途,布局類型改動(dòng)等都需要去更新布局。
主要實(shí)現(xiàn)代碼如下:


Snipaste_2021-11-02_12-34-26.png

Snipaste_2021-11-02_12-35-52.png

3.如何設(shè)置漸變色

  • plan A: 最開始是重寫系統(tǒng)繪制方法draw(_ rect: CGRect)曹洽,繪制一個(gè)漸變色鳍置,剛開始也沒發(fā)現(xiàn)問題,然而在實(shí)際開發(fā)的項(xiàng)目中發(fā)現(xiàn)送淆,cllectionview的cell里面放Button税产,cell很多的情況下按鈕沒法正常顯示了,只要重寫draw(_ rect: CGRect)就會(huì)有問題 ?? ??
  • plan B:使用CAGradientLayer創(chuàng)建一個(gè)圖層,插入到按鈕的圖層中偷崩,傳參做相應(yīng)處理辟拷,各種場(chǎng)景測(cè)試沒發(fā)現(xiàn)bug。 主要代碼如下:


    Snipaste_2021-11-02_14-21-48.png

4.如何優(yōu)雅設(shè)置漸變色圓角

  • 如果Button沒有陰影那么使用masksToBounds切圓角是完全ok的
  • 然鵝有時(shí)候阐斜,UI設(shè)計(jì)陰影衫冻、圓角、漸變色同時(shí)存在谒出,那么我們除了要給Button設(shè)置圓角隅俘,還要給漸變色layer設(shè)置圓角,我這里直接利用了KVC獲取Button圓角給漸變色layer設(shè)置邻奠,省去了傳參賦值的麻煩。主要代碼如下:


    Snipaste_2021-11-03_11-46-33.png

5.點(diǎn)擊高亮狀態(tài)設(shè)置

這個(gè)不是很復(fù)雜为居,主要是重寫點(diǎn)擊響應(yīng)三個(gè)方法
touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
touchesEnded(_ >touches: Set<UITouch>, > with event: UIEvent?)
touchesBegan 保存原有顏色碌宴,賦值高亮色,touchesCancelled蒙畴、touchesEnded還原原有顏色即可

Snipaste_2021-11-02_14-40-12.png

3.使用效果

  • 上面的問題解決后贰镣,現(xiàn)在看看實(shí)現(xiàn)一個(gè)布局樣式+陰影+圓角+漸變色按鈕的代碼:


    Snipaste_2021-11-02_14-45-32.png

常用方法系統(tǒng)Button基本保持一致,其他需求基本一行代碼搞定膳凝,是不是覺得非常方便呢~

下面是demon的展示效果~

08929ebe-ef8a-40dd-af1d-127fdb32de8c.gif

4.源碼和demon地址

github地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末八孝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸠项,更是在濱河造成了極大的恐慌,老刑警劉巖子姜,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟绊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哥捕,警方通過查閱死者的電腦和手機(jī)牧抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遥赚,“玉大人扬舒,你說我怎么就攤上這事≠旆穑” “怎么了讲坎?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)愧薛。 經(jīng)常有香客問我晨炕,道長(zhǎng),這世上最難降的妖魔是什么毫炉? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任瓮栗,我火速辦了婚禮,結(jié)果婚禮上瞄勾,老公的妹妹穿的比我還像新娘费奸。我一直安慰自己,他們只是感情好进陡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布愿阐。 她就那樣靜靜地躺著,像睡著了一般四濒。 火紅的嫁衣襯著肌膚如雪换况。 梳的紋絲不亂的頭發(fā)上职辨,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音戈二,去河邊找鬼舒裤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的适滓。 我是一名探鬼主播罢坝,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伴鳖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徙硅,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤榜聂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗓蘑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體须肆,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年桩皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豌汇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泄隔,死狀恐怖拒贱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佛嬉,我是刑警寧澤逻澳,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站暖呕,受9級(jí)特大地震影響赡盘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缰揪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一陨享、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钝腺,春花似錦抛姑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至毫目,卻和暖如春蔬啡,著一層夾襖步出監(jiān)牢的瞬間诲侮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工箱蟆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沟绪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓空猜,卻偏偏與公主長(zhǎng)得像绽慈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辈毯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 Hello坝疼!小伙伴!首先非常感謝您閱讀海轟的文章谆沃,倘若文中有錯(cuò)誤的地方钝凶,歡迎您指出~哈哈 自我介紹一下昵稱:...
    海轟Pro閱讀 264評(píng)論 0 0
  • 問題描述 App 開發(fā)中,有時(shí)候需要改變導(dǎo)航欄或者狀態(tài)欄背景色唁影、字體顏色腿椎,或者實(shí)現(xiàn)導(dǎo)航欄背景色漸變效果,那么夭咬,接下...
    sessionCh閱讀 3,464評(píng)論 0 1
  • 說起shape,大家應(yīng)該或多或少都知道并用過铆隘,有什么用卓舵,我們平常在開發(fā)當(dāng)中,通常會(huì)遇到這樣的情況膀钠,就是會(huì)給控件增加...
    玖玖君閱讀 1,757評(píng)論 1 4
  • 最近把項(xiàng)目中使用到的部分組件和一些平時(shí)寫的組件整理了一下掏湾,放在一個(gè)小程序中,僅供參考肿嘲!文章底部有g(shù)ithub鏈接融击。...
    杰銘的博客閱讀 1,516評(píng)論 0 3
  • 說起shape,大家應(yīng)該或多或少都知道并用過雳窟,有什么用尊浪,我們平常在開發(fā)當(dāng)中,通常會(huì)遇到這樣的情況封救,就是會(huì)給控件增加...
    i小灰閱讀 2,571評(píng)論 2 10