IOS中UIControl使用及介绍

时间:2016-10-01
UIControl,相信大家对其并不陌生吧,比如平常最常用的UIButton就是继承自UIControl的。下面通过本篇文章给大家介绍ios中UIControl,感兴趣的朋友一起学习吧

打羽毛球有个有趣的现象,只要是对方发现你的弱点,他就专攻你弱点,把你打的满场飞奔,场面上占尽优势。技术上也同样如此,一个弱点,一个弄不清楚的地方会导致后面在开发中,在面试时不断吃亏。所以,对于不懂的地方尽快弄懂,坚持一段时间你的段位就会不断提高。

这段时间我准备好好梳理一下UIKit框架中的成员:(这章是关于UIControl)

UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、

UIPageControl分页控件。

控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏、表格单元,甚至更大的对象。

这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力。所有

控件都拥有一套共同的属性和方法。

所以学习控件,我们先学习UIControl.

UIControl属性

enabled

控件默认是启用的。要禁用控件,可以将enabled属性设置为NO,这将导致控件忽略任何触摸事件。被禁用后,控件还可以用不同的方式显示自己,比如变成灰色不可用。虽然是由控件的子类完成的,这个属性却存在于UIControl中。

selected

当用户选中控件时,UIControl类会将其selected属性设置为YES。子类有时使用这个属性来让控件选择自身,或者来表现不同的行为方式。

contentVerticalAlignment

控件如何在垂直方向上布置自身的内容。默认是将内容顶端对其,对于文本字段,可能会改成UIControlContentVerticalAlignmentCenter。对于这个字段,可以使用下列诸值:

  1. UIControlContentVerticalAlignmentCenter  
  2. UIControlContentVerticalAlignmentTop  
  3. UIControlContentVerticalAlignmentBottom  
  4. UIControlContentVerticalAlignmentFill

 
contentHorizontalAlignment

水平方向

  1. UIControlContentHorizontalAlignmentCenter  
  2. UIControlContentHorizontalAlignmentTop  
  3. UIControlContentHorizontalAlignmentBottom  
  4. UIControlContentHorizontalAlignmentFill  

UIControl事件通知

UIControl类提供了一个标准机制,来进行事件登记和接收。这令你可以指定你的控件在发生特定事件时,通知代理类的一个方法。如果要注册一个事件,可以使用addTarget方法:

[ myControl addTarget: myDelegate   action:@selector(myActionmethod:)  forControlEvents:UIControlEventValueChanged ];

事件可以用逻辑OR合并在一起,因此可以再一次单独的addTarget调用中指定多个事件。下列事件为基类UIControl所支持,除非另有说明,也适用于所有控件

  • UIControlEventTouchDown:单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
  • UIControlEventTouchDownRepeat:多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
  • UIControlEventTouchDragInside:当一次触摸在控件窗口内拖动时。
  • UIControlEventTouchDragOutside:当一次触摸在控件窗口之外拖动时。
  • UIControlEventTouchDragEnter:当一次触摸从控件窗口之外拖动到内部时。
  • UIControlEventTouchDragExit:当一次触摸从控件窗口内部拖动到外部时。
  • UIControlEventTouchUpInside:所有在控件之内触摸抬起事件。
  • UIControlEventTouchUpOutside:所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
  • UIControlEventTouchCancel:所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
  • UIControlEventTouchChanged:当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。
  • UIControlEventEditingDidBegin:当文本控件中开始编辑时发送通知。
  • UIControlEventEditingChanged:当文本控件中的文本被改变时发送通知。
  • UIControlEventEditingDidEnd:当文本控件中编辑结束时发送通知。
  • UIControlEventEditingDidOnExit:当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
  • UIControlEventAllEditingEvents:通知所有关于文本编辑的事件。
  • UIControlEventAllEvents:通知所有事件。

要删除一个或多个事件的相应动作,可以使用UIControl类的removeTarget方法。使用nil值就可以将给定事件目标的所有动作删除:

[ myControl removeTarget:myDelegate   action:nil  forControlEvents:UIControlEventAllEvents];

要取得关于一个控件所有指定动作的列表,可以使用allTargets方法。这个方法返回一个NSSet,其中包含事件的完整列表:

NSSet* myActions = [myConreol allTargets ];  

另外,你还可以用actionsForTarget方法,来获取针对某一特定事件目标的全部动作列表:

NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];

如果设计了一个自定义控件类,可以使用sendActionsForControlEvent方法,为基本的UIControl事件或自己的自定义事件发送通知。例如,如果你的控件值正在发生变化,就可以发送相应通知,通过控件的代码可以指定时间目标,这个通知将被传播到这些指定的目标。例:

[ self sendActionsForControlEvents:UIControlEventValueChanged ]; 

当委托类得到事件通知时,他将收到一个指向事件发送者的指针。下面的例子用于处理分段控件的事件,你的动作方法(action method)应遵循类似的处理方式:

-(void) myAction:(id)sender{  

       UISegmentedControl* control = (UISegmentedControl*)sender;  

       if(control == myControl1){  

         

       

       }  
} 

UITouch类中包含如下成员函数:

- (CGPoint)locationInView:(UIView *)view:函数返回一个CGPoint类型的值,表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

- (CGPoint)previousLocationInView:(UIView *)view:该方法记录了前一个坐标值,函数返回也是一个CGPoint类型的值, 表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

当手指接触到屏幕,不管是单点触摸还是多点触摸,事件都会开始,直到用户所有的手指都离开屏幕。期间所有的UITouch对象都被包含在UIEvent事件对象中,由程序分发给处理者。事件记录了这个周期中所有触摸对象状态的变化。

只要屏幕被触摸,系统就会报若干个触摸的信息封装到UIEvent对象中发送给程序,由管理程序UIApplication对象将事件分发。一般来说,事件将被发给主窗口,然后传给第一响应者对象(FirstResponder)处理。

一直有两个问题困扰我:

1,看过一道面试题目,UIButton的父类是什么?我的第一反应时UIView,最后证实其实是UIControl。这里教大家一个小技巧,iOS所有的头文件都是可以看到的。比方说看UIButton的头文件,只要按下command按钮,将鼠标移动到 变量声明的地方,如UIButton *btn;这时UIButton会出现下划线,点击鼠标左键就可跳转到头文件。好的程序员要抱有强烈的好奇心,一窥头文件定义可以学习到很多东西,提供很多学习的线索。

2,要求在点页面上空白的地方,就能缩回键盘。其中一种实现方法就是:将背景view设为:UIControl;通过调用UIControll的Touch Down事件,让键盘消失。然我感到好奇的是,UIControl究竟是何方神圣竟能替代UIView。

通过进一步查看UIControl的头文件可以发现,UIControl继承于UIView,怪不得可以替代UIView。所以整个继承关系是UIView-》UIControl-》UIButton。

UIControl是对触摸事件的具体化

要了解UIControl,必须简单说一下UITouch和UIEvent事件,都是和触摸相关,UIEvent是一系列UITouch的集合,在IOS中负责响应触摸事件。在IOS中,所有事件有一个最先响应者,事件可以沿着响应者链向下传递。

UIControl是UIView的子类,当然也是UIResponder的子类。UIControl是诸如UIButton、UISwitch、UITextField等控件的父类,它本身也包含了一些属性和方法,但是不能直接使用UIControl类,它只是定义了子类都需要使用的方法。

UIControl对象采用了一种新的事件处理机制,将触摸事件转换成简单操作,这样可以无需关心用户访问控件的具体方式。触摸事件到达UIControl对象(由响应者链派遣)后,在UIResponder的方法中(如touchBegan:withEvent)中,UIControl将标准的触摸事件转换为特殊的控件事件,简单的理解就是,UIControl把复杂的触摸事件封装成了简单的易于使用的控件事件。例如通过UIControl对象处理后,按下按钮的事件就被封装成一个控件事件,而不用去判断触摸屏幕的整个操作过程。

例如按钮的单击事件:UIControlEventTouchUpInside

我们所需要知道的是UIControl首先将触摸事件转换为控件事件,再转换为带接收放的操作。我们只要编写第二次转换的代码,就是将控件事件转换为有目标的操作。

 

使用addTarget:action:forControlEvents

这是UIControl的一个方法,为指定的控件对象添加事件,例如:[controlObj

addTarget:recepientObj action @selector(method) froControlEvents :

UIControlEvents]; controlObj是要响应事件的控件对象;参数receientObj是要把消息发送到哪里,一般是self,通常指实例化控件对象的控制器;action后面是一个选择器,表示该事件需要响应的方法,事件做什么其实就写在这个方法里面;最后一个是事件类型,表示响应什么样的事件。

如何判断是否继承自UIControl

1,从代码里看继承关系;

2,从xib设置页面上看,继承自UIControl会多一些设置:

如何判断是否继承自UIControl

如何判断是否继承自UIControl

总结:

1,如果严格规定继承自UIControl的才是控件的话,那么UILabel只能算UI组件,而不是UI控件;常见控件:UISwitch开关、UIButton按钮、UISegmentedControl分段、UISlider滑块、UITextField文本字段、UIPageControl分页。

2,UIControl和UIView的区别不大,无非是将手势识别为具体的动作:按下,抬起.