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];

}

=======================

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

时间: 2024-11-08 21:53:05

UI开发----事件处理的相关文章

iOS开发UI篇—事件处理(完成一个简单的涂鸦板)

iOS开发UI篇-事件处理(实现一个简单的涂鸦板) 一.说明 该程序使用事件处理机制和绘图完成了一个简单的涂鸦板应用,使用鼠标在涂鸦板内拖动即可进行涂鸦,点击保存到相册按钮,可以把完成的涂鸦保存到手机的相册中,点击回退按钮可以向后退回一步,点击清空可以让涂鸦板清空. 文件结构和界面搭建: 二.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 02-画板程序 4 // 5 // Created by apple on 14-6-

iOS开发UI篇—事件处理简单介绍1

iOS开发UI篇—事件处理简单介绍 一.事件处理简单介绍 说明:ios中的事件 在用户使用app过程中,会产生各种各样的事件 ,iOS中的事件可以分为3大类型 : 1.响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 2.UIResponder UIResponde

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

十二、Android UI开发专题(转)

http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的.本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露.本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.gra

Android UI开发神兵利器之Angrytools

最近很多人在问我,个人App开发者如何去设计UI. 其实这是个人开发者最头痛的问题,搞技术的人,确实没法做到面面俱到,不可能花大量的时间去切图,去做原型设计,去做美工. 当然,虽然我们设计不出那么复杂,精巧的UI,但是简单的东西,我们在没有美工的基础上,通过一些手段,也是可以做的不错的,从本文开始,我们将介绍一些关于Android界面开发的神兵利器,正是这些大神们开发的工具,让Coder也能做出一些不是那么见不得人的设计. Angrytools,我们今天的主角,我想当初作者也是被UI弄的Angr

Android:日常学习笔记(8)———探究UI开发(2)

Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示: Dialog 类是对话框的基类,但您应该避免直接实例化 Dialog,而是使用下列子类之一: AlertDialog此对话框可显示标题.最多三个按钮.可选择项列表或自定义布局. DatePickerDialog 或 TimePickerDialog此对话框带有允许用户选择日期或时间的预定义 UI

Swift UI开发初探

今天凌晨Apple刚刚发布了Swift编程语言,Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言. 废话不多说,下面我就来学习使用Swift创建一个简单的UI应用程序. 关于Swift语法,可以参考<Apple Swift编程语言入门教程> 效果如下: 开发环境 Xcode6-beta iOS8 创建工程 Choose File > New > Project > (iOS or OS X) > Application > yo

Android UI开发——使用Fragment构建灵活的桌面

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google  IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的布局文件实现的.当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验.例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fr

Android UI开发专题(转)

http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255 Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的.本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露.本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.gr