UIView 重绘与多点触控事件处理
2015-09-15 14:47
330 查看
UIView除了负责界面的处理外,同事也继承了UIResponder这个类。所以它也必须要处理一些常见的事件,例如界面的重绘以及多点触控事件的处理。
1.重绘事件的处理
一般来说,我们不需要重载UIView的drawRect:的方法。但是在某些情况下,例如要动态制作某些图形到UIView上面的适合,我们就可以在继承UIView 的类里面重载drawRect:方法。由于这个方法属于回调函数(callback),因此它会在界面重画时自动调用。如果要强迫iPhone重绘界面的适合,也请不要直接调用这个方法,而是通过 UIView 的setNeedsDisplay 来更新界面,或者是通过 setNeedsDisplayInRect: 来局部更新某个区域的界面。
2.多点触控事件处理
由于UIView 继承了 UIResponder,因此,我们可以直接在 UIView里面处理有关多点触控的事件。
这三个方法会再触控到UIView 所属的区域时自动调用。不论使用几根手指触控,碰到屏幕的一开始,就会发送一词touchesBegan:withEvent:的消息,其中,touches表示不分先后顺序的多个触控点,event则为触控的事件,可以得到在这个触控事件内有几个点击数(tapCount);当按住界面移动的时候,touchesMoved:withEvent:的这个消息则会被发送出去,一直到放开手指后才回发送touchesEnded:withEvent:的消息,整个触控事件才算结束。
例如下面这段常用到得源代码
在一般情况下,我们只在乎用户的点击操作,通过NSSet里面anyObject 方法可以取得任一个触控点。相对的,如果很在意用户用了几个手指通过UITOuch 类的locationInView: 来取得触控点得位置,以及通过tapCount 来取得用户点击的次数
通过多点触控,我们做一个应用程序,这个应用程序是以人的3个手指来表示颜色中得R、G、B (红绿蓝)。第一个手指头表示R,第二个表示G,第三个表示B,也可以只使用一个或两个手指头来改变界面的颜色。
其中,颜色值的部分是通过 UIColor这个类来产生的,通过RGBA来制定红绿蓝三种颜色以及 Alpha值,要注意,这三个颜色值范围是从0到1 而非255.
Xcode默认产生的 Storyboard里面的界面中得 Multiple touch 的选项是取消状态,只要勾选就可以接受多点触控了。
1.重绘事件的处理
- (void) drawRect:(CGRect) rect;
一般来说,我们不需要重载UIView的drawRect:的方法。但是在某些情况下,例如要动态制作某些图形到UIView上面的适合,我们就可以在继承UIView 的类里面重载drawRect:方法。由于这个方法属于回调函数(callback),因此它会在界面重画时自动调用。如果要强迫iPhone重绘界面的适合,也请不要直接调用这个方法,而是通过 UIView 的setNeedsDisplay 来更新界面,或者是通过 setNeedsDisplayInRect: 来局部更新某个区域的界面。
2.多点触控事件处理
由于UIView 继承了 UIResponder,因此,我们可以直接在 UIView里面处理有关多点触控的事件。
-(void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event; -(void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event; -(void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event;
这三个方法会再触控到UIView 所属的区域时自动调用。不论使用几根手指触控,碰到屏幕的一开始,就会发送一词touchesBegan:withEvent:的消息,其中,touches表示不分先后顺序的多个触控点,event则为触控的事件,可以得到在这个触控事件内有几个点击数(tapCount);当按住界面移动的时候,touchesMoved:withEvent:的这个消息则会被发送出去,一直到放开手指后才回发送touchesEnded:withEvent:的消息,整个触控事件才算结束。
例如下面这段常用到得源代码
-(void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event{ UITouch *touch = [touches anyObject]; //或 UITouch *touch = [[touches allObjects] objectAtIndex:0]; CGPoint location = [touch locationInView:self]; //取得触控点 ... if([touch tapCount] == 2){ //若点击两下 ... } }
在一般情况下,我们只在乎用户的点击操作,通过NSSet里面anyObject 方法可以取得任一个触控点。相对的,如果很在意用户用了几个手指通过UITOuch 类的locationInView: 来取得触控点得位置,以及通过tapCount 来取得用户点击的次数
通过多点触控,我们做一个应用程序,这个应用程序是以人的3个手指来表示颜色中得R、G、B (红绿蓝)。第一个手指头表示R,第二个表示G,第三个表示B,也可以只使用一个或两个手指头来改变界面的颜色。
\\ViewController.m -(void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *)event { int count = [touches count]; switch (count){ case 3: blueColor = (blueColor>1)?0:blueColor+0.05; case 2: greenColor = (greenColor>1)?0:greenColor+0.05; case 1: redColor = (redColor>1)?0:redColor+0.05; default: break; } self.view.backgroundColor = [UIColor colorWithRed:redColor green:greenColor blue:blueColor alpha:1.0];
其中,颜色值的部分是通过 UIColor这个类来产生的,通过RGBA来制定红绿蓝三种颜色以及 Alpha值,要注意,这三个颜色值范围是从0到1 而非255.
Xcode默认产生的 Storyboard里面的界面中得 Multiple touch 的选项是取消状态,只要勾选就可以接受多点触控了。
相关文章推荐
- web前端开发常用的10个高端CSS UI开源框架
- js中val()和value的区别
- easyui load reload acceptChanges函数的区别
- soapui 自动化教程(三)
- [LeetCode 225] Implement Stack using Queues
- MKNetworkKit下载图片并显示在UIImageView上
- Android --Android Stuido 导入jar包
- UUID 3DES Base64
- request、response 中文乱码问题与解决方式
- 安卓build编译各种系统镜像的过程。
- String.valueOf() 方法的使用
- OPEN(SAP) UI5 学习入门系列之三:MVC (下) - 视图与控制器
- Unique Binary Search Trees II
- 使用AndroidStudio执行UI Automator 自动化测试
- Longest Consecutive Sequence
- MiniGUI文档参考手册 基于v1.6.10文本
- STL 之 deque的用法
- 完美激活Flash builder 4.7
- UVA-1252 Twenty Questions (状压DP)
- Rearrange a string so that all same characters become d distance away minDistance priority queue