cocoa touch——UIControl——state,highlighted,enabled,selected

定义

@property(nonatomic,readonly) UIControlState state;                  // could be more than one state (e.g. disabled|selected). synthesized from other flags.

@property(nonatomic,getter=isEnabled) BOOL enabled;                                  // default is YES. if NO, ignores touch events and subclasses may draw differently
@property(nonatomic,getter=isSelected) BOOL selected;                                // default is NO may be used by some subclasses or by application
@property(nonatomic,getter=isHighlighted) BOOL highlighted;                          // default is NO. this gets set/cleared automatically when touch enters/exits during tracking and cleared on up

state

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
};
state类型为UIControlState,bitmask形式保存状态,可同时保存多组状态

highlighted,enabled,selected

state的低3位保存highlighted,disabled,selected,从UIControlState定义中可以得出:
  • normal/highlighted保存在第0位,0表示normal,1表示highlighted
  • enabled/disabled保存在第1位,0表示enabled,1表示disabled
  • selected/deselected保存在第2位,0表示deselected,1表示selected

state和appearance(只考虑state低3位)

继承自UIControl的控件可以定制四种appearance,分别为default,highlighted,selected,disabled,对应state的低3位为:
  • 000(0):default(highlighted=0,disabled=0,selected=0)
  • 001(1):highlighted(highlighted=1,disabled=0,selected=0)
  • 010(2):disabled(highlighted=0,disabled=1,selected=0)
  • 100(4):selected(highlighted=0,disabled=0,selected=1)
继承自UIControl的控件可以定制四种appearance,但四种appearance都是optional定制,如果对应的appearance没有定制,控件显示default appearance
如果state低3位保存多组状态,UIControl控件appearance显示规律为:
highlighted=1
  • disabled=1,selected=0,011(3),appearance=highlighted
  • disabled=0,selected=1,101(5),appearance=default
  • disabled=1,selected=1,111(7),appearance=default
  • selected=1,disabled=1,111(7),appearance=default
disabled=1
  • highlighted=0,selected=1,110(6),appearance=default
  • highlighted=1,selected=0,010(2),appearance=disabled
  • highlighted=1,selected=1,110(6),appearance=default
  • selected=1,highlighted=1,110(6),appearance=default
selected=1
  • highlighted=1,disabled=0,101(5),appearance=default
  • highlighted=0,disabled=1,110(6),appearance=default
  • highlighted=1,disabled=1,111(7),appearance=default
  • disabled=1,highlighted=1,110(6),appearance=default
state设置总结:
  • state 000(0),highlighted,disabled,selected都未设置,此时设置其中任何1位,可正常设置
  • 已设置disabled情况下,设置highlighted无效(ignored)
state和appearance关系总结:
  • state至多包含1位1(000,001,010,100)时,appearance正常显示appearance
  • state包含2位或3位1时,只有011(3)时,appearance=highlighted,其余情况appearance=default
用代码表示:
@implementation UIControl

//...

- (void)setHighlighted:(BOOL)highlighted
{
    if(highlighted == YES && !(_state & UIControlStateDisabled))
    {
        _state |= UIControlStateHighlighted;
    }
    else
    {
        _state &= ~UIControlStateHighlighted;
    }
}

- (BOOL)isHighlighted
{
    return _state & UIControlStateHighlighted;
}

- (void)setEnabled:(BOOL)enabled
{
    if(enabled == YES)
    {
        _state &= ~UIControlStateDisabled;
    }
    else
    {
        _state |= UIControlStateDisabled;
    }
}

- (BOOL)isEnabled
{
    return !(state & UIControlStateDisabled)
}

- (void)setSelected:(BOOL)selected
{
    if(selected == YES)
    {
        _state |= UIControlStateSelected;
    }
    else
    {
        _state &= ~UIControlStateSelected;
    }
}

- (BOOL)isSelected
{
    return _state & UIControlStateSelected;
}

- (UIControlState)state
{
    return _state;
}

- (void)appearance
{
    switch(_state & 0x7)
    {
        case 0:
            _appearance = DefaultAppearance;
            break;
        case 1:
            _appearance = HighlightedAppearance;
            break;
        case 2:
            _appearance = DisabledAppearance;
            break;
        case 3:
            _appearance = HighlightedAppearance;
            break;
        case 4:
            _appearance = SelectedAppearance;
            break;
        default:
            _appearance = DefaultAppearance;
            break;
    }
    
    if(_appearance == nil)
    {
        _appearance = DefaultAppearance;
    }
}

//...

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值