码迷,mamicode.com
首页 > 其他好文 > 详细

UI开发----事件处理

时间:2015-04-15 19:36:19      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:ui   多点触摸   

// 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];
    
}
=======================

来吧,沙尘暴~~~~~~~~~



UI开发----事件处理

标签:ui   多点触摸   

原文地址:http://blog.csdn.net/guoxianzhuang/article/details/45062879

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!