如何创建iOS自定义控件

如何创建iOS自定义控件,第1张

IOS中得控件,大家并不陌生。那么如何来自定义一个控件呢,对于纯粹的显示类的控件我们在这里不再赘述,只是说一下自定义控件,如何响应点击消息。

一、UIControl中的触摸事件响应函数

自定义一个控件,如果是需要响应点击消息、拖动消息,大多是直接继承自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不让系统为我们添加额外的约束

* 约束应该加到父视图上


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11320149.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存