
自定义一个控件,如果是需要响应点击消息、拖动消息,大多是直接继承自UIControl,在不熟悉下面所要讲的东西之前,一直是自己写手势判断来响应,然后发现... ...后面的都不说了,一切都是泪啊!
二、Target-Action模式
在可以响应触摸事件之后,就会如何使其调用我们的自定义方法了。在了解这个模式之前,都是一直在用“protocol”来做... ...好了,一切不说从前。
见如下代码:
// 添加一个 target/action 注册事件及其响应
<span style="color:#ff6666">- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents</span>
// 移除一个 target/action 注销事件及其响应
- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
// 获取所有 target/action 的 target 对象
- (NSSet *)allTargets
// 获取所有要响应的 UIControlEvents
- (UIControlEvents)allControlEvents
// 获取指定target和UIControlEvents的action的方法名,target不能为nil
- (NSArray *)actionsForTarget:(id)target forControlEvent:(UIControlEvents)controlEvent
// 调用指定的 target/action,第三个参数作用未知
- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
// 发送一个事件,使触发对应的 target/action 可以指定自定义事件
<span style="color:#ff6666">- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents</span>
使用,标为红色的两个方法,我们就可以实现自定义方法的处理。
下列事件为基类UIControl所支持,除非另有说明,也适用于所有控件。
UIControlEventTouchDown // 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
UIControlEventTouchDownRepeat // 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
UIControlEventTouchDragInside //当一次触摸在控件窗口内拖动时。
UIControlEventTouchDragOutside //当一次触摸在控件窗口之外拖动时。
UIControlEventTouchDragEnter //当一次触摸从控件窗口之外拖动到内部时。
UIControlEventTouchDragExit //当一次触摸从控件窗口内部拖动到外部时。
UIControlEventTouchUpInside //所有在控件之内触摸抬起事件。
UIControlEventTouchUpOutside //所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
UIControlEventTouchCancel //所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
UIControlEventTouchChanged //当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。
UIControlEventEditingDidBegin //当文本控件中开始编辑时发送通知。
UIControlEventEditingChanged //当文本控件中的文本被改变时发送通知。
UIControlEventEditingDidEnd //当文本控件中编辑结束时发送通知。
UIControlEventEditingDidOnExit //当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
UIControlEventAlltouchEvents //通知所有触摸事件。
UIControlEventAllEditingEvents //通知所有关于文本编辑的事件。
UIControlEventAllEvents //通知所有事件。
打开文件TBViewController.m,看看viewDidLoad方法里面的代码:- (void)viewDidLoad
{
[super viewDidLoad]
self.view.backgroundColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:1]
//Create the Circular Slider
TBCircularSlider *slider = [[TBCircularSlider alloc]initWithFrame:CGRectMake(0, 60, TB_SLIDER_SIZE, TB_SLIDER_SIZE)]
//Define Target-Action behaviour
[slider addTarget:self action:@selector(newValue:) forControlEvents:UIControlEventValueChanged]
[self.view addSubview:slider]
}
在上面的代码中,给view设置了一个背景色,并通过调用initWithFrame方法实例化了一个圆形滑块(自定义的控件)。
注意:UIControl继承自UIView,所以它继承了UIView的所有方法。
接着定义了如何与该控件进行交互:使用addTarget:action:forControlEvent:方法。
该方法只是给控件的特定事件设置一下target-action。如果你还记得的话,上面层介绍过,每当用户移动手柄时,圆形滑块都会发送一个UIControlEventValueChanged事件。所以我们可以通过下面的代码为该事件注册一个action:
[slider addTarget:self action:@selector(newValue:) forControlEvents:UIControlEventValueChanged]
这样就可以创建一个**newValue**方法来处理值发生改变时的一些事情:
-(void)newValue:(TBCircularSlider*)slider{ NSLog(@"Slider Value %d",slider.angle)}
##代码添加自动布局NSLayoutConstrain
vfl火星语
使用vfl可以生成多个NSLayoutConstrain对象,存放在数组
|:是父视图的边界
[视图的对象名==(另一个视图)]:
例:"H:|-space-[view1(==space)]-|"
[NSLayoutConstrain constrainsWithVisualFormat:火星语 options:添加的顺序从左到右(默认的就可以) metrics:所有数值的字典 views:对象字典或NSDictionaryOfVariableBindings(对象)这个是自动生成字典]
* 该对象一定要将translatesAutoresizingMaskIntoConstraints = NO不让系统为我们添加额外的约束
* 约束应该加到父视图上
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)