定义
@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