// Created By 郭仔 2015年04月15日18:01:00
今天北京7级大风,伴随沙尘暴,让哥骑自行车怎么搞~~~~~~~~~~~~~~~~~
=================================================
实现触摸:
UIView⽀支持触摸事件(因为继承于UIResponder),⽽而且⽀支持多 点触摸。
需要定义UIView⼦子类,实现触摸相关的⽅方法。
touches..began、touches..moved、touches...ended、 touches..canceled。
手势:
⼿手势:有规律的触摸。
UITouch代表触摸在屏幕上的⼀一根⼿手指。可以获取触摸时间和触摸 位置。
如何获取touch对象。touches集合中包含了视图上的所有⼿手势。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
// 打开多点触摸,UIView默认是单点触摸
self.multipleTouchEnabled = YES;
self.backgroundColor = [UIColor cyanColor];
UIView * redView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
redView.backgroundColor = [UIColor redColor];
[self addSubview:redView];
// 给属性赋值
self.redView = redView;
[redView release];
// ==================
UIView * label = [[UIView alloc]initWithFrame:CGRectMake(0, 100, 100, 100)];
label.backgroundColor = [UIColor orangeColor];
// 打断事件的交互
label.userInteractionEnabled = NO;
[self addSubview:label];
[label release];
UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];
btn.backgroundColor = [UIColor greenColor];
btn.frame = CGRectMake(20, 40, 50, 50);
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(xiangying:) forControlEvents:UIControlEventTouchUpInside];
[label addSubview:btn];
}
return self;
}
- (void)xiangying:(UIButton *)sender
{
NSLog(@"事件相应");
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"TouchesMoved!");
// 触摸点的个数
NSLog(@"%d",[touches count]);
// 1.获取移动先前的一个位置
UITouch * touch = [touches anyObject];
CGPoint prePoint = [touch previousLocationInView:self];
// 获取touch发生在哪个视图
UIView * touchView = [touch view];
if (touchView == self.redView) {
// 2.获取当前位置
CGPoint newPoint = [touch locationInView:self];
// 3.计算偏移量
// CGPoint offPoint = CGPointMake(newPoint.x - prePoint.x, newPoint.y-prePoint.y);
float offsetX = newPoint.x - prePoint.x;
float offsetY = newPoint.y - prePoint.y;
// 4.根据偏移量改变redView的位置
CGPoint center = self.redView.center;
center.x += offsetX;
center.y += offsetY;
//NSLog(@"%f",(self.redView.center.x);
// 这句话肯定报错,因为左边的第二个点是set方法
// self.redView.center.x = self.redView.center.x + offsetX;
//写开来就是这种表达: [self.redView setCenter:].x,肯定错误
self.redView.center = center;
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// 记录末点
CGPoint endPoint = [[touches anyObject]locationInView:self];
// 判断清扫方向
float dx = endPoint.x - self.startPoint.x;
float dy = endPoint.y - self.startPoint.y;
if(dx > 50 && fabs(dy) <= 50)
{
NSLog(@"向右");
}
else if (dx <= -50 && fabs(dy) < 50)
{
NSLog(@"向左");
}
else if(fabs(dx)< 50 && dy <= -50)
{
NSLog(@"向上");
}
else if(fabs(dx) < 50 && dy >= 50)
{
NSLog(@"向下");
}
else
{
NSLog(@"滑动太短");
}
NSLog(@"TouchesEnded!");
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// =====================
// 记录起点
CGPoint startPoint = [[touches anyObject]locationInView:self];
self.startPoint = startPoint;
//=================
NSLog(@"TouchesBegan!");
// 打印点击次数
UITouch * touch = [touches anyObject];
NSLog(@"点击次数:%d",touch.tapCount);
// 获取随机色
// 改变redView颜色 ,取0到1之间的值
float red = (arc4random()%256)/255.0;
float green = (arc4random()%256)/255.0;
float blue = (arc4random()%256)/255.0;
UIColor * randomColor = [UIColor colorWithRed:red green:green blue:blue alpha:1];
self.redView.backgroundColor = randomColor;
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"TouchesCancelled!");
}
- (void)dealloc
{
[_redView release];
[super dealloc];
}
======================
响应者链:
硬件检测到触摸操作,会将信息交给UIApplication,开始检测。
UIApplication -> window -> viewController -> view -> 检测所有⼦子 视图
最终确认触碰位置,完成响应者链的查询过程。
处理触碰事件:
检测到响应者后,实现touchesBegan:withEvent:等⽅方法,即处理事 件。
如果响应者没有处理事件,事件会向下传递。如果没有响应者处理,
则丢弃触摸事件。
事件处理的顺序与触摸检测查询相反。
触摸的⼦子视图 -> view -> viewController -> window -> UIApplication
阻断响应者链:
响应者链可以被打断。⽆无法完成检测查询过程。
视图类的属性 : userInteractionEnabled。关闭后能阻断查询过 程。
======================
另外一个容易忽略的小错误:
// 这句话肯定报错,因为左边的第二个点是set方法
// self.redView.center.x = self.redView.center.x + offsetX;
//写开来就是这种表达: [self.redView setCenter:].x,肯定错误
=======================
另外注意控制器中容易忽略的一句赋值语句
- (void)loadView
{
LoginView * logV = [[LoginView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.view = logV; // 就是这里
[logV release];
}
=======================
来吧,沙尘暴~~~~~~~~~