有這樣一個需求,一個按鈕笋粟,選中時展示一個image怀挠,未選中時展示另外一個image。于是我們開開心心的寫了下面一段代碼:
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateNormal];
[followBtn setImage:_IMAGE(@"icStarSelected") forState:UIControlStateSelected];
然后button點擊后改變button的selected狀態(tài)害捕。
點擊绿淋,運行。
效果是達到了尝盼,但是總感覺怪怪的吞滞。Normal和Selected變化的過程中會閃一下別的圖案。
于是东涡,我們想起來冯吓,有一個highlightedState。好吧疮跑,給highlitedState也設(shè)置個圖片吧组贺。
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateHighlighted];
等等。好像也不對啊祖娘。
這樣設(shè)置后,按鈕從normal變?yōu)閟elected的過程看起來似乎行得通了,但是,從selected再變回normal的過程還是會出現(xiàn)那個該死的hightLighted狀態(tài)失尖。
感到奇怪吧?我們明明已經(jīng)設(shè)置了hightLighted狀態(tài)下的圖片,怎么回來的路行不通呢? 有沒有可能從selected狀態(tài)變回normal狀態(tài)這個過程經(jīng)歷的并不是hightLighted狀態(tài),而是其他什么狀態(tài)呢?
沒錯,這個狀態(tài)就是UIControlStateSelected | UIControlStateHighlighted,我們可以理解成選中時候的高亮狀態(tài)。
于是我們的代碼變成了這樣:
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateNormal];
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateHighlighted];
[followBtn setImage:_IMAGE(@"icStarSelected") forState:UIControlStateSelected];
[followBtn setImage:_IMAGE(@"icStarSelected") forState:UIControlStateSelected | UIControlStateHighlighted];
再次點擊運行渐苏。大功告成掀潮,normal和selected狀態(tài)完美切換。
其實琼富,我們可以點擊進入button的state查看仪吧,它是一個BitMask:
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0, // used when UIControl isHighlighted is set
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2, // flag usable by app (see below)
UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus
UIControlStateApplication = 0x00FF0000, // additional flags available for application use
UIControlStateReserved = 0xFF000000 // flags reserved for internal framework use
};
我們可以兩兩組合。分別得出按鈕的不同的狀態(tài)鞠眉。這樣就可以分別設(shè)置按鈕不同狀態(tài)時候的圖片啦薯鼠。
本人QQ:297959735 郵箱:zgsddzwj@163.com,歡迎提意見械蹋。