iOS:触摸控件UITouch、事件类UIEvent

UITouch:触摸控件类   UIEvent:事件类

??????UITouch的介绍??????

一、触摸状态类型枚举

typedef NS_ENUM(NSInteger, UITouchPhase) {

UITouchPhaseBegan,             // 开始触摸

UITouchPhaseMoved,             // 触摸移动

UITouchPhaseStationary,       // 触摸没有移动

UITouchPhaseEnded,             //触摸结束

UITouchPhaseCancelled,         //取消触摸

};

@interface UITouch : NSObject

二、属性:

//时间戳记录了触摸事件产生或变化时的时间,单位是秒

@property(nonatomic,readonly) NSTimeInterval   timestamp;

//当前触摸事件在一个周期中所处的状态

@property(nonatomic,readonly) UITouchPhase  phase;

//表示短时间内点按屏幕的次数

@property(nonatomic,readonly) NSUInteger  tapCount;

//触摸的主半径

@property(nonatomic,readonly) CGFloat majorRadius;

//触摸的主半径的公差

@property(nonatomic,readonly) CGFloat majorRadiusTolerance;

//触摸产生时所处的窗口。由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口

@property(nonatomic,readonly,retain) UIWindow    *window;

//触摸产生时所处的视图。由于视图可能发生变化,当前视图也不一定时最初的视图

@property(nonatomic,readonly,retain) UIView      *view;

//触摸手势数组

@property(nonatomic,readonly,copy)   NSArray   *gestureRecognizers;

三、方法:

//返回当前触摸点的位置

- (CGPoint)locationInView:(UIView *)view;

//返回上一个触摸点的位置

- (CGPoint)previousLocationInView:(UIView *)view;

@end

四、由于触摸点被放在了NSSet,所以通过NSSet集合的一个属性和方法可以获取触摸点:

//获取全部的触摸点

@property (readonly, copy) NSArray *allObjects;

//获取当前触摸点

- (id)anyObject;

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

??????UIEvent的介绍??????

//输入事件类型枚举

typedef NS_ENUM(NSInteger, UIEventType) {

UIEventTypeTouches,             //触摸事件

UIEventTypeMotion,              //运动事件

UIEventTypeRemoteControl,    //远程控制事件

};

//输入事件不同类型的一些具体事件枚举

typedef NS_ENUM(NSInteger, UIEventSubtype) {

UIEventSubtypeNone                              = 0,

UIEventSubtypeMotionShake                       = 1

UIEventSubtypeRemoteControlPlay                 = 100,

UIEventSubtypeRemoteControlPause                = 101,

UIEventSubtypeRemoteControlStop                 = 102,

UIEventSubtypeRemoteControlTogglePlayPause      = 103,

UIEventSubtypeRemoteControlNextTrack            = 104,

UIEventSubtypeRemoteControlPreviousTrack        = 105,

UIEventSubtypeRemoteControlBeginSeekingBackward = 106,

UIEventSubtypeRemoteControlEndSeekingBackward   = 107,

UIEventSubtypeRemoteControlBeginSeekingForward  = 108,

UIEventSubtypeRemoteControlEndSeekingForward    = 109;

};

//类

@interface UIEvent : NSObject

//属性

@property(nonatomic,readonly) UIEventType    type ;            //事件类型

@property(nonatomic,readonly) UIEventSubtype  subtype ;     //同一事件类型的具体事件

@property(nonatomic,readonly) NSTimeInterval  timestamp;    //事件触发时间间隔

//方法

※所有触摸点

- (NSSet *)allTouches;

※窗体上的触摸点

- (NSSet *)touchesForWindow:(UIWindow *)window;

※视图上的触摸点

- (NSSet *)touchesForView:(UIView *)view;

※手势触摸点

- (NSSet *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture;

@end

五、举例如下:演示触摸事件(都是用鼠标代替手指在模拟器上进行测试)

实例一:打印触摸输出

1.设置用户交互和触摸点

//支持用户交互,能够处理触摸事件
self.view.userInteractionEnabled = YES;

//支持多点触摸
self.view.multipleTouchEnabled = YES;

2.实现UIResponser中触摸的4个事件

触摸开始

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"触摸开始");

    //取出一个touch对象
    UITouch *touch = [touches anyObject];

    //取出当前点
    CGPoint location = [touch locationInView:self.view];

    //取出上一点
    CGPoint previousLocation = [touch previousLocationInView:self.view];

    NSLog(@"%@,%@",NSStringFromCGPoint(location),NSStringFromCGPoint(previousLocation));

    //遍历每一个touch对象
    [touches enumerateObjectsUsingBlock:^(UITouch *touch, BOOL *stop) {

    }];
}

触摸移动

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"触摸移动");
}

触摸结束

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"触摸结束");
}

触摸取消(该事件在模拟器不好演示)

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"触摸取消");
}

演示结果如下:

1.在屏幕上开始触摸和结束触摸时:

2015-10-08 21:21:24.875 02-touch[5988:346647] 触摸开始
2015-10-08 21:21:24.875 02-touch[5988:346647] {219.5, 181},{219.5, 181}
2015-10-08 21:21:24.983 02-touch[5988:346647] 触摸结束

2.在屏幕上触摸移动时:

2015-10-08 21:23:00.388 02-touch[5988:346647] 触摸移动
2015-10-08 21:23:00.413 02-touch[5988:346647] 触摸移动
2015-10-08 21:23:00.430 02-touch[5988:346647] 触摸移动

实例二:触摸时,视图变色(每触摸一次,颜色就交替改变)

<1>布局故事板,在视图中在拖一个试图UIView控件,设置合适大小和背景颜色

<2>自定义一个试图类,将控件与该类关联

       

<3>在自定义类myView.m中实现触摸开始事件

//开始触摸
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([self.backgroundColor isEqual:[UIColor redColor]])
    {
        self.backgroundColor = [UIColor purpleColor];
    }
    else
    {
        self.backgroundColor = [UIColor redColor];
    }
}

<4>演示结果如下

开始颜色:红色                        触摸一次:变为紫色                 再触摸一次:又变为红色

   

实例三:触摸移动时,移动红色试图位置

<1>布局故事板,在视图中在拖一个试图UIView控件,设置合适大小和背景颜色

<2>自定义一个试图类,将控件与该类关联,同时将视图IBOutLet到视图控制器类中

       

<3> 在控制器类ViewController.m中实现触摸移动事件

//添加移动事件
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    //获取触摸对象touch
    UITouch *touch = [touches anyObject];

    //当前触摸点
    CGPoint location = [touch locationInView:self.view];

    //设置触摸点只有在myView中,才可以移动myView视图
    CGPoint point = [touch locationInView:self.myView];
    if ([self.myView pointInside:point withEvent:event])
    {
        //上一个触摸点
        CGPoint previousLocation = [touch previousLocationInView:self.view];

        //计算位移
        CGFloat xOffset = location.x - previousLocation.x;
        CGFloat yOffset = location.y - previousLocation.y;

        //设置视图新的位置
        CGPoint center = self.myView.center;
        self.myView.center = CGPointMake(center.x+xOffset, center.y+yOffset);
    }

}

<4>演示结果如下:触摸红色视图位置拖拽移动即可

    

     

时间: 2024-10-18 12:22:01

iOS:触摸控件UITouch、事件类UIEvent的相关文章

iOS控件之UIResponder类

iOS控件之UIResponder类 在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,我们知道UIApplication.UIView.UIViewController这几个类是直接继承自UIResponder,UIWindow是直接继承自UIView的一个特殊的View,所以这些类都可以响应事件.当然我们自定义的继承自UIView的View以及自定义的继承自UIViewController的控制器都可以响应事件.iOS里面通常将这些能响应事件的对象称之为响应者. iO

重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

[源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性 作者:webabcd介绍重新想象 Windows 8.1 Store Apps 之控件增强 文本类控件的增强 为一些控件增加了 Header 属性和 HeaderTemplate 属性 为一些控件增加了 PlaceholderText 属性 示例1.演示

iOS UITextField控件总结

iOS UITextField控件总结 先声明下面总结不是自己写的. //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox

原文:背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) RichTextBlock RichTextBlockOverflow RichEditBox 示例1.RichTextBlock 的示例Controls/TextControl/RichTextBlockDemo.xaml <Page

背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(媒体类) 通过处理 Pointer 相关事件实现一个简单的涂鸦板 InkCanvas 基础知识 示例1.演示如何通过 Pointer 相关事件的处理,来实现一个简单的涂鸦板Controls/MediaControl/InkSimple.xaml <Page x:Class="Windows10.Controls.MediaControl.InkSimple" xmlns="http://s

在cocos2d-js实现自动绑定cocostudioUI控件与事件(三)

一.为cc.Node类型节点注册触摸事件 演示常规方式为cc.Node类型注册触摸事件 ctor: function() { ... this._label = new ... cc.eventManager.addListener({ event: cc.EventListener.TOUCH_ONE_BY_ONE, swallowTouches: true, onTouchBegan: this.onTouchBegan, onTouchMoved: this.onTouchMoved, o

IOS—UITextFiled控件详解

IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderS

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid