UIControl是控制对象,是UIButton,UIDatePicker,UIpageControl,UISegmentedControl,UITextField,UISlider,UISwitch的基类。你不能直接使用UIControl类来实例化控件。
UIControl的主要作用是创建相应的逻辑将action分发到对应的target,另外90%的情况下,它会根据自身的状态(例如Highlighted, Selected和Disabled等)来绘制用户界面。
通过UIControl,我们主要管理3个重要的任务:
(1)绘制用户界面
(2)跟踪用户的操作
(3)Target-Action模式
准备和发送操作消息:
1.针对一个给定事件,通知应用程序对象,让调用目标的指定行为方法:
- (void)sendAction:(SEL)action
to:(id)target
forEvent:(UIEvent *)event
2.执行与指定事件相关的行为方法:
- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents
如果设计了一个自定义控件类,可以使用sendActionsForControlEvent方法,为基本的UIControl事件或自己的自定义事件发送通知。例如,如果你的控件值正在发生变化,就可以发送相应通知,通过控件的代码可以指定时间目标,这个通知将被传播到这些指定的目标。例:
[ self sendActionsForControlEvents:UIControlEventValueChanged ];
3.为指定的控件添加事件:
- (void)addTarget:(id)target
action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
target表示要把消息发送到哪里,一般是self,通常值实例化控件对象的控制器;action是一个选择器,表示该事件需要响应的方法,事件做什么其实就写在这个方法里面;最后一个是事件类型,表示响应什么样的事件。
4.取消事件处理函数:
- (void)removeTarget:(id)target
action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
5.获取针对某一特定事件目标的全部动作列表:
- (NSArray *)actionsForTarget:(id)target
forControlEvent:(UIControlEvents)controlEvent
例如:
NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];
6.取得关于一个控件所有指定动作的列表:
- (NSSet *)allTargets
要取得关于一个控件所有指定动作的列表,可以使用allTargets方法。这个方法返回一个NSSet,其中包含事件的完整列表:
NSSet* myActions = [myConreol allTargets ];
7.返回控件响应的事件:
- (UIControlEvents)allControlEvents
获取和设置控件属性:
8.接收器的状态:
@property(nonatomic, readonly) UIControlState state
9.是否接受事件:
@property(nonatomic, getter=isEnabled) BOOL enabled
控件默认是启用的。要禁用控件,可以将enabled属性设置为NO,这将导致控件忽略任何触摸事件。被禁用后,控件还可以用不同的方式显示自己,比如变成灰色不可用。虽然是由控件的子类完成的,这个属性却存在于UIControl中。
10.控件选中状态:
@property(nonatomic, getter=isSelected) BOOL selected
当用户选中控件时,UIControl类会将其selected属性设置为YES。子类有时使用这个属性来让控件选择自身,或者来表现不同的行为方式。
11.当你的手指按下去,还没放的时候:
@property(nonatomic, getter=isHighlighted) BOOL highlighted
Highligted 和 Selected 是不同的状态,是不可以混用的,这些 UIControlState 是针对所有的 UIControl 定义的,但是实际上不是每个 UIControl 都会经历到这些个 State
基本的 State 变化过程如下:
(1).什么都没干的时候:Normal
(2).当你的手指按下去,还没放的时候:Highlighted
(3).当手指放开的时候:如果这个 UIControl 有 Selected 状态的话,就会变成: Selected
再重复上述过程一次,就会从 Selected->Highlighted-> Normal
但是普通的 UIButton 这个 UIControl 的 subclass,是没有 Selected 状态的,它就只有 Normal 和 Highlighted,只会在这两个状态间切换。(正常情况下,如果你设置了 disable 的话,还会变到 Disabled)
12.控件如何在垂直/水平方向上布置自身的内容:
@property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment
@property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment
默认是将内容顶端对其,对于文本字段,可能会改成UIControlContentVerticalAlignmentCenter。对于这个字段,可以使用下列诸值:
(1).UIControlContentVerticalAlignmentCenter
(2).UIControlContentVerticalAlignmentTop
(3).UIControlContentVerticalAlignmentBottom
(4).UIControlContentVerticalAlignmentFill
水平方向(1).UIControlContentHorizontalAlignmentCenter
(2).UIControlContentHorizontalAlignmentTop
(3).UIControlContentHorizontalAlignmentBottom
(4).UIControlContentHorizontalAlignmentFill
跟踪触摸和重绘制控件:
13.跟踪触摸,拦截用户自定义事件:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch
withEvent:(UIEvent *)event
14.
- (BOOL)continueTrackingWithTouch:(UITouch *)touch
withEvent:(UIEvent *)event
15.
- (void)endTrackingWithTouch:(UITouch *)touches
withEvent:(UIEvent *)event
16.
- (void)cancelTrackingWithEvent:(UIEvent *)event
17.
@property(nonatomic, readonly, getter=isTracking) BOOL tracking
18.指示触摸是否在指示器的界限:
@property(nonatomic, readonly, getter=isTouchInside) BOOL touchInside
数据类型:
19.控制事件的枚举:
typedef NSUInteger UIControlEvents;
20.状态掩码类型:
typedef NSUInteger UIControlState;
常数:
21.控件可能的事件类型:
enum {
UIControlEventTouchDown = 1 << 0,
UIControlEventTouchDownRepeat = 1 << 1,
UIControlEventTouchDragInside = 1 << 2,
UIControlEventTouchDragOutside = 1 << 3,
UIControlEventTouchDragEnter = 1 << 4,
UIControlEventTouchDragExit = 1 << 5,
UIControlEventTouchUpInside = 1 << 6,
UIControlEventTouchUpOutside = 1 << 7,
UIControlEventTouchCancel = 1 << 8,
UIControlEventValueChanged = 1 << 12,
UIControlEventEditingDidBegin = 1 << 16,
UIControlEventEditingChanged = 1 << 17,
UIControlEventEditingDidEnd = 1 << 18,
UIControlEventEditingDidEndOnExit = 1 << 19,
UIControlEventAllTouchEvents = 0x00000FFF ,
UIControlEventAllEditingEvents = 0x000F0000 ,
UIControlEventApplicationReserved = 0x0F000000 ,
UIControlEventSystemReserved = 0xF0000000 ,
UIControlEventAllEvents = 0xFFFFFFFF
};
22.内容垂直/水平对齐:
typedef enum {
UIControlContentVerticalAlignmentCenter = 0,
UIControlContentVerticalAlignmentTop = 1,
UIControlContentVerticalAlignmentBottom = 2,
UIControlContentVerticalAlignmentFill = 3,
} UIControlContentVerticalAlignment;
typedef enum {
UIControlContentHorizontalAlignmentCenter = 0,
UIControlContentHorizontalAlignmentLeft = 1,
UIControlContentHorizontalAlignmentRight = 2,
UIControlContentHorizontalAlignmentFill = 3,
} UIControlContentHorizontalAlignment;
23.控制状态:
enum {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0,
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2,
UIControlStateApplication = 0x00FF0000 ,
UIControlStateReserved = 0xFF000000
};