#UIButton更換圖片或者文字閃動的解決bash
在咱們作開發的時候,或多或少的會使用UIButton,且可能會較頻繁的更換圖片或者文字 簡單的舉幾個例子, 1.在咱們寫登陸或者註冊等頁面的時候,可能會須要些一個倒計時的按鈕,不斷的更新時間, 2.在某一個tableview或者collectionView中,某些cell中會有按鈕控件 3.咱們寫某些支付界面,可能選擇某一個金額的時候,對應下面的支付按鈕就會更換文字,好比支付XXX元... ... 因此,對於這些小需求的實現,咱們其實會有不少的實現方式, 不管是使用UIButton,或者是UILabel,... 亦或者是使用自定義的繼承UIView,或者UIControl等控件,其實均可以很輕鬆的完成動畫
在這裏咱們只說使用UIButton的狀況 那麼細心的同窗是否會發現,在咱們使用UIButton的時候,咱們會發現更換圖片或者文字的時候圖片或者文字會發生閃動的狀況? 相似這樣的 ui
這種狀況很容易復現, 1.UIButton的樣式是system樣式(不是custom) 2.已經有文字或者圖片的狀況下更換文字或者圖片spa
好比咱們的寫一個倒計時按鈕,無非就是使用一個按鈕,而後不停的間隔1秒鐘更換button的文字便可. 這裏咱們若是使用UIButton的話咱們須要有取捨, 1.使用system的樣式的話,在咱們點擊的狀況下會有點擊的變灰的效果,會讓咱們有一個按下的反饋的感受,而使用custom則不會有這樣的狀況,你按下不會有什麼反應,除非你定義按下的效果,這樣的話代碼相對會不少.且不容易達到system樣式的按下效果. 2.使用system樣式的咱們卻會糾結於每秒更換一次文字的時候按鈕的閃動效果, 這是咱們特別不想看到的.使用custom則沒有閃動的效果,3d
因此,咱們可否很簡單簡單的結合呢? 既有按鈕點擊的按下變暗的反饋效果,也有更換文字不閃動的效果.且使用最小的代碼量?code
三個方案 1.使用system樣式,解決閃動 2.使用custom樣式,解決按下反饋效果 3.使用自定義控件替代orm
這裏簡單的構思一下,使用自定義控件替代的話,等於徹底拋棄UIButton,這樣咱們既要實現按鈕的效果,也要實現按鈕的點擊....複雜難度最高 使用custom樣式的話,跟上面說的同樣,按鈕的點擊效果,咱們經過nomal,select等狀態來修改不一樣的樣式,咱們可能會須要寫不少冗餘的代碼,只是爲了實現點擊的效果,並且尚未system的天然 因此最終,我仍是選擇system的樣式,咱們僅僅須要讓他不閃動就行了cdn
達到不閃動的效果其實相似這樣 blog
其實代碼很簡單 僅僅須要一行便可self.button.titleLabel.text = string;
複製代碼
是的,僅僅須要一行便可 可是並非在任何地方添加均可以 該行代碼僅僅能添加在一個位置纔有效果繼承
self.button.titleLabel.text = string;
[self.button setTitle:string forState:UIControlStateNormal];
複製代碼
是的就是這樣,在咱們一般設置按鈕文字的方法上加上這一行便可,必需要在其前一行,
一樣的,若是咱們的按鈕上面有圖片,圖片也發生閃動的話,原理也是同樣,防止閃動,只須要
self.button.imageView.image = image;
[self.button setImage:image forState:UIControlStateNormal];
複製代碼
基礎這兩行代碼不能分開寫,若是分開好比這樣寫
self.button.titleLabel.text = string;
self.button.imageView.image = image;
[self.button setTitle:string forState:UIControlStateNormal];
[self.button setImage:image forState:UIControlStateNormal];
複製代碼
就不會有效果!!!!
必需要連載一塊兒寫,且寫在各自的設置的前面
//防止文字閃動
self.button.titleLabel.text = string;
[self.button setTitle:string forState:UIControlStateNormal];
//防止圖片閃動
self.button.imageView.image = image;
[self.button setImage:image forState:UIControlStateNormal];
複製代碼
是的就是這麼簡單,就能處理閃動的效果
你可能會不屑一顧,感受這個沒有什麼有用的效果.
下面是我最近的一個項目, 首頁是一個collectionView 內部的cell由於某些緣由就是一個按鈕(這裏不解釋).,而後我就會在刷新collectionView的時候發生閃動的狀況,
這裏某些經歷過collectionView的reloadData的坑的開發者都會說,這是由於刷新形成的,只要使用隱式動畫刷新便可[UIView performWithoutAnimation:^{
[self.collectionView reloadData];
}];
複製代碼
剛開始我也這麼認爲,也這麼作了,可是結果是我失望了,刷新的時候仍然有閃動, 而當我將上面的cell用原來的button的部分更換成imageView和lable的組合的時候則不會閃動了, 因此閃動的狀況就是由於按鈕形成的, 咱們不能由於按鈕閃動而放棄按鈕,或者這裏可能適合,可是某些地方咱們仍然可能須要按鈕的使用,因此
只須要巧妙的添加兩行代碼便可,也就是上面介紹的防止閃動的代碼
瞬間,一切都好了
在這裏我也就把這個小技巧分享給你們,或許你沒有遇到過這樣的問題,可是當你遇到的時候,若是你知道簡單的兩行便可解決,不是更好嗎?