iOS那些坑

关于UIButton的highlightedState

2017-11-15  本文已影响2人  zgsddzwj

有这样一个需求,一个按钮,选中时展示一个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,欢迎提意见。

上一篇 下一篇

猜你喜欢

热点阅读