有这样一个需求,一个按钮,选中时展示一个image,未选中时展示另外一个image。于是我们开开心心的写了下面一段代码:
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateNormal];
[followBtn setImage:_IMAGE(@"icStarSelected") forState:UIControlStateSelected];
然后button点击后改变button的selected状态。
点击,运行。
效果是达到了,但是总感觉怪怪的。Normal和Selected变化的过程中会闪一下别的图案。
于是,我们想起来,有一个highlightedState。好吧,给highlitedState也设置个图片吧。
[followBtn setImage:_IMAGE(@"icStar") forState:UIControlStateHighlighted];
等等。好像也不对啊。
这样设置后,按钮从normal变为selected的过程看起来似乎行得通了,但是,从selected再变回normal的过程还是会出现那个该死的hightLighted状态。
感到奇怪吧?我们明明已经设置了hightLighted状态下的图片,怎么回来的路行不通呢? 有没有可能从selected状态变回normal状态这个过程经历的并不是hightLighted状态,而是其他什么状态呢?
没错,这个状态就是UIControlStateSelected | UIControlStateHighlighted,我们可以理解成选中时候的高亮状态。
于是我们的代码变成了这样:
[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状态完美切换。
其实,我们可以点击进入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
};
我们可以两两组合。分别得出按钮的不同的状态。这样就可以分别设置按钮不同状态时候的图片啦。
本人QQ:297959735 邮箱:zgsddzwj@163.com,欢迎提意见。
网友评论