01 触摸事件
来源:互联网 发布:php 数组最大值 编辑:程序博客网 时间:2024/04/30 02:54
1.事件处理方法
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; // 默认NO 多点触摸 self.view.multipleTouchEnabled = YES; // 默认view YES 交互关闭 imageView 默认关闭 //self.view.userInteractionEnabled = YES; // 如果父视图的交互关闭,会影响到子视图 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(60, 100, 200, 35); [button setTitle:@"action" forState:UIControlStateNormal]; [self.view addSubview:button];}/** * 重复父类的方法 */- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // UITouch -> 触摸 -> 手指头数量(触摸点数量) //NSLog(@"开始触摸 : %d", [touches count]); // 获取touch对象 UITouch *touch = [touches anyObject]; /* NSLog(@"阶段 : %d", [touch phase]); // 获取窗口对象 UIWindow *widow = [touch window]; */ // 获取点击次数 NSUInteger tapCount = [touch tapCount]; NSLog(@"tap : %lu", (unsigned long)tapCount); // 获取当前的位置 CGPoint location = [touch locationInView:self.view]; NSLog(@"location : %@", NSStringFromCGPoint(location)); }// 开始触摸- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ /* UITouch *touch = [touches anyObject]; // 获取前一个位置 CGPoint previous = [touch previousLocationInView:self.view]; NSLog(@"previous : %@", NSStringFromCGPoint(previous)); */}// 开始移动- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"触摸结束");}// 触摸结束- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"触摸被取消");}// 触摸被取消,一定在触摸事件在执行时,才有取消的条件(比如电话)
</pre><pre name="code" class="objc">还学到了:
01.// 设置状态栏的背景风格
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
02.Button可以响应多个Target事件1
03.设置父视图的userInteractionEnable为NO,会影响到其子视图。和设置alpha类似,当视图透明时,其子视图也会发生变化。
</pre><pre name="code" class="objc">2.练习
- (void)viewDidLoad { [super viewDidLoad]; self.view.multipleTouchEnabled = YES;}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; /* // 单击&双击 ; 双手单机&双手双击 if ([touch tapCount] == 2 && [touches count] == 2) { // 取消上一个调用的方法 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap) object:nil]; [self doubleTap]; }else if ([touch tapCount] == 1 && [touches count] == 2) {
<span style="white-space:pre"></span>// 延迟<span style="white-space:pre"></span>[self performSelector:@selector(singleTap) withObject:nil afterDelay:0.2]; } */ // 获取当前位置 _precious = [touch locationInView:self.view]; }// 处理单机&双击事件- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint end = [touch locationInView:self.view];
<span style="white-space:pre"></span>// 位差调用 if (fabs(end.x - _precious.x) > 100.f) { NSLog(@"hehe"); }}#pragma mark - Private Methods- (void)singleTap{ NSLog(@"singleTap");}- (void)doubleTap{ NSLog(@"doubleTap");}
3.响应事件者链
01.事件传递
UIApplication对象从事件队列中取出最前面的事件并将其分发。通常,其发送事件交由应用程序的主窗口——UIWindow实例,再由窗口对象发送事件给“第一响应者(触摸的视图)”处理。
</pre><pre name="code" class="objc">- (void)viewDidLoad { [super viewDidLoad]; // View /* UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(60, 100, 200, 35); [button setTitle:@"action" forState:UIControlStateNormal]; [button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; */ // GestureRecognizer /* UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(test)]; [self.view addGestureRecognizer:tap]; */ // 下一个响应者测试 /* MyView *view = [[MyView alloc] initWithFrame:CGRectMake(60, 200, 200, 200)]; view.backgroundColor = [UIColor redColor]; [self.view addSubview:view]; */ // imageView UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(60, 100, 200, 200)]; imgView.userInteractionEnabled = YES; imgView.backgroundColor = [UIColor redColor]; [self.view addSubview:imgView]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(50, 100, 100, 35); button.backgroundColor = [UIColor grayColor]; [button setTitle:@"action" forState:UIControlStateNormal]; [imgView addSubview:button];}- (void)test{ NSLog(@"用户点击");}
// 子类化窗口
#import "MyWindow.h"@implementation MyWindow- (void)sendEvent:(UIEvent *)event{ NSLog(@"发糖"); [super sendEvent:event];}// 所有的事件都是由app交给窗口分发出去的@end
还学到:
001.有些情况可有多个窗口的存在(比如:在qq消息的提示位置也有一个窗口),但只能有一个keyWindow.
</pre><pre name="code" class="objc">2.响应事件者链
响应事件者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder),如果响应,事件就会被截获(处理)。
// 查看响应层次结构
id next = [[[[[[self nextResponder] nextResponder] nextResponder] nextResponder] nextResponder] nextResponder];
01.过程
</pre><pre name="code" class="objc" style="font-size: 14px;"><span style="font-family: Arial, Helvetica, sans-serif;">- (id)initWithFrame:(CGRect)frame </span><span style="font-family: Arial, Helvetica, sans-serif;">{</span>
self = [super initWithFrame:frame]; if (self) { UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.alpha = 0.01; button.frame = CGRectMake(50, 100, 100, 35); button.backgroundColor = [UIColor lightGrayColor]; [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"push" forState:UIControlStateNormal]; [self addSubview:button]; } return self;}- (void)click:(UIButton *)sender{ id next = [self nextResponder]; while (next != nil) { NSLog(@"next : %@", next); next = [next nextResponder]; if ([next isKindOfClass:[UIViewController class]]) { UIViewController *vc = next; DetailViewController *detail = [[DetailViewController alloc] init]; [vc.navigationController pushViewController:detail animated:YES]; break; } }}
3.事件拦截
userInteractionEnabled = NO;
hidden = YES;
alpha[[0~0.01]范围];
4.手势识别器
</pre><pre name="code" class="objc">- (void)viewDidLoad { [super viewDidLoad]; /** * 单击、双击 */ /* UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; // 次数(单击、双击) singleTap.numberOfTapsRequired = 1; // 触摸数量(手指头的数量) singleTap.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:singleTap]; UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; // 次数(单击、双击) doubleTap.numberOfTapsRequired = 2; // 触摸数量(手指头的数量) //doubleTap.numberOfTouchesRequired = 2; [self.view addGestureRecognizer:doubleTap]; // 当双击时,单击失效 [singleTap requireGestureRecognizerToFail:doubleTap]; */ /** * 轻扫 不能一个手指识别多个方向。 */ /* UISwipeGestureRecognizer *swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; swipe1.direction = UISwipeGestureRecognizerDirectionRight; [self.view addGestureRecognizer:swipe1]; UISwipeGestureRecognizer *swipe2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; swipe2.direction = UISwipeGestureRecognizerDirectionLeft; [self.view addGestureRecognizer:swipe2]; */ /** * 轻扫 */ /* _panView = [[UIView alloc] initWithFrame:CGRectMake(0, 100, 40, 40)]; _panView.backgroundColor = [UIColor redColor]; [self.view addSubview:_panView]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:pan]; */ /** * 长按 */ /* UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; longPressGesture.minimumPressDuration = 2.f; [self.view addGestureRecognizer:longPressGesture]; */ /** * 旋转 */ /* UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)]; [self.view addGestureRecognizer:rotationGesture]; */ /** * 捏合 */ UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)]; [self.view addGestureRecognizer:pinch];}- (void)singleTap:(UITapGestureRecognizer *)tap{ // 得到坐标位置 NSLog(@"单击 : %@", NSStringFromCGPoint([tap locationInView:self.view]));}- (void)doubleTap:(UITapGestureRecognizer *)tap{ NSLog(@"双击");}////////////////////////////////////////////////////////////////////////////////////////////////- (void)swipe:(UISwipeGestureRecognizer *)swipe{ NSLog(@"direction : %ld", swipe.direction);}////////////////////////////////////////////////////////////////////////////////////////////////- (void)pan:(UIPanGestureRecognizer *)pan{ CGPoint point = [pan locationInView:self.view]; _panView.center = point;}// move////////////////////////////////////////////////////////////////////////////////////////////////- (void)longPress:(UILongPressGestureRecognizer *)lon{ if (lon.state == UIGestureRecognizerStateBegan) { NSLog(@"开始 : %ld", lon.state); }else if (lon.state == UIGestureRecognizerStateEnded) { NSLog(@"结束 : %ld", lon.state); }else if (lon.state == UIGestureRecognizerStateChanged) { NSLog(@"移动 : %ld", lon.state); }}////////////////////////////////////////////////////////////////////////////////////////////////- (void)rotation:(UIRotationGestureRecognizer *)rotate{
<span style="white-space:pre"></span>//// 角度。
<span style="white-space:pre"></span>//float degress = rotate.rotation * (180 / M_PI);}////////////////////////////////////////////////////////////////////////////////////////////////- (void)pinch:(UIPinchGestureRecognizer *)pinch{ NSLog(@"pinch : %.1f", pinch.scale); if (pinch.velocity > 0) { NSLog(@"放大"); }else { NSLog(@"放小"); }}
</pre><pre name="code" class="objc">
0 0
- 01 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- 触摸事件
- Canvas的饼图百分比标注位置计算技巧
- JAVA学习笔记(二十五) - 泛型Generic
- 栈 字符缓存栈的实现
- [WebKit内核] JavaScriptCore深度解析--基础篇(一)字节码生成及语法树的构建详情分析
- 大数据实时处理:百分点实时计算架构和算法
- 01 触摸事件
- Hive整理
- 32、编码一个CU(帧内部分)1
- 仿QQ侧滑菜单,HorizontalScrollView和DrawerLayout实现对比
- arcgis for flex api version3.7 教程:3.如何使用QueryTask查询地图服务
- 谈谈程序员的自我管理
- 小公司的敏捷之路-站立会议
- 初识MVC
- 值得收藏的各种C#方法