ios开发事件处理之:一:UIView的拖拽

1.ios当中常?的事件?  触摸事件 ,加速计事件 ,远程控制事件

2.什么是响应者对象? 继承了UIResponds的对象我们称它为响应者对象 UIApplication、UIViewController、UIView都继承?自UIResponder 因此它们都是响应者对象,都能够接收并处理事件

3.为什么说继承了UIResponder就能够处理事件? 因为UIResponder内部提供了以下?方法来处理事件 ?比如

触摸事件会调?用以下?方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

加速计事件会调?用:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
远程控制事件会调?用:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

4.如何监听UIView的触摸事件?
想要监听UIViiew的触摸事件,?首先第?一步要?自定义UIView,
因为只有实现了UIResponder的事件?方法才能够监听事件.

UIView的触摸事件主要有:

?一根或者多根?手指开始触摸view,系统会?自动调?用view的下?面?方法.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

?一根或者多根?手指在view上移动时,系统会?自动调?用view的下?面?方法
(随着?手指的移动,会持续调?用该?方法,也就是说这个?方法会调?用很多次)

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

?一根或者多根?手指离开view,系统会?自动调?用view的下?面?方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

?一当突然发生系统事件的时候,例如突然来了系统电话,或是手机没电的时候,系统就会自动调用

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

参数说明:

touches:

touches中存放的都是UITouch对象,它是一个NSSet集合.NSSet和NSArray一样同样属于集合,但是NSSet是无序的,NSArray是有序的,有序的就可以通过index将对象从集合中取出

UITouch对象它就是用来保存手指相关联的信息.包括位置,时间,阶段等信息.

每一个手指对应着一个UITouch对象.

这个UITouch是系统自动帮我们创建的,当手指移动时,系统会更新同一个UITouch对象,

使它能够一直保存该手指在的触摸位置

通过获取UITouch属性,我们可以获得触摸产生时所处的窗口,触摸的View,时间,点击的次数等,

这些都可以在通过UITouch获取.

UITouch方法:

@property(nonatomic,readonly) NSTimeInterval      timestamp;//获取点击的时间

@property(nonatomic,readonly) UITouchPhase        phase;//点击的状态

@property(nonatomic,readonly) NSUInteger          tapCount;   //点击的次数

@property(nullable,nonatomic,readonly,strong) UIWindow  *window;//点击的所在的window

@property(nullable,nonatomic,readonly,strong) UIView *view;//点击所在的view

event:

还可以通过UITouch提供的方法获取当前手指所在的点,以及上一个手指所在的点.

取当前手指所在的点

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

获取上一个触摸点的位置.

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

每产生一个事件,就会产生一个UIEvent对象

UIEvent:称为事件对象,记录事件产生的时刻和类型

一次完整的触摸过程,会经历3个状态:

触摸开始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

触摸移动:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

触摸结束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

触摸取消(可能会经历):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数

如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象

如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,

并且每次调用时的touches参数中只包含一个UITouch对象

5. UIView拖拽思路?
1.?自定义UIView,实现监听?方法.
2.确定在TouchMove?方法当中进?行操作,因为?用户?手指在视图上移动的时候才需要移动视
图。
3.获取当前?手指的位置和上?一个?手指的位置.
4.当前视图的位置 = 上?一次视图的位置 - ?手指的偏移量

实现关键代码:
当?手指在屏幕上移动时调?用持续调?用
NSSet:?里?面的元素都是?无序的.
NSArray:?里?面的有顺序的.
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event{

1.获取?手指的对象
UITouch *touch = [touches anyObject];

2.获取当前?手指所在的点.
CGPoint curP = [touch locationInView:self];
3.获取?手指的上?一个点.

CGPoint preP = [touch previousLocationInView:self];
X轴?方向偏移量

CGFloat offsetX = curP.x - preP.x;
Y轴?方向偏移量

CGFloat offsetY = curP.y - preP.y;
CGAffineTransformMakeTranslation:会清空上?一次的形变.
self.transform = CGAffineTransformMakeTranslation(offsetX,

0);

self.transform = CGAffineTransformTranslate(self.transform,
offsetX, offsetY);

}

#import "RedView.h"

@implementation RedView

//当开始触摸屏幕的时候调用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"%s",__func__);
}

//触摸时开始移动时调用(移动时会持续调用)

/*

  1:touches.allObjects:获得所有的触摸的手指UITouch对象:当只有一根手指触摸屏幕就会产生一个UITouch对象,一个UITouch对象通过[touches anyObject]获得
  2: CGPoint curP = [touch locationInView:self];
     CGPoint preP = [touch previousLocationInView:self];
  3:要累加形变:所以用CGAffineTransformTranslate(self.transform, offsetX, offsetY),初始状态self.transform为0
 */
//NSSet:无序
//NSArray:有序
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //做UIView拖拽
    UITouch *touch = [touches anyObject];

    //求偏移量 = 手指当前点的X - 手指上一个点的X
    CGPoint curP = [touch locationInView:self];
    CGPoint preP = [touch previousLocationInView:self];
    NSLog(@"curP====%@",NSStringFromCGPoint(curP));
    NSLog(@"preP====%@",NSStringFromCGPoint(preP));

    CGFloat offsetX = curP.x - preP.x;
    CGFloat offsetY = curP.y - preP.y;

    //平移
    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);

}

//当手指离开屏幕时调用
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
     NSLog(@"%s",__func__);
}

//当发生系统事件时就会调用该方法(电话打入,自动关机)
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
     NSLog(@"%s",__func__);
}

@end

时间: 2024-10-13 11:55:08

ios开发事件处理之:一:UIView的拖拽的相关文章

iOS开发拓展篇—xib中关于拖拽手势的潜在错误

iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行程序,程序直接崩溃,报错如下: 说明:手势不会有superView方法,superView是UIView的方法,说明我们错误的把手势对象当成是UIView来用了. 调试查看出现问题的原因: 出现问题的原因: 说明:通过lastObject取出来的对象是手势,而不是xib,因此出现上面的错误. 把la

IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

IOS开发UI篇—手势识别器(拖拽+旋转+缩放) 一.拖拽 示例代码: 1 // 2 // YYViewController.m 3 // 06-拖拽事件 4 // 5 // Created by apple on 14-6-19. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 11 @interface YYViewController ()

iOS开发小技巧--cell往左拖拽出现很多按钮的实现,仅仅适用于iOS8以后

1 // 往左拖拽cell出现多个按钮的实现,仅仅适用于iOS_8.0以后 2 - (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath 3 { 4 UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITab

UIVIew的拖拽及对UIResponder、UITouch的稍加说明

UIView的拖拽 1.自定义一个UIView 2.在UIView的.m文件中实现touchMoved方法 实现代码如下 #import "kds.h" @implementation kds - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    UITouch *touch = [touches anyObject];    //获取当前点    CGPoint cu

IOS开发—事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 二.UIResponder UIResponder内部提供了以下方法来处理事件触摸事件- (v

IOS UIWebView去掉滚动条和黑色背景即拖拽后的上下阴影

隐藏滚动条和上下滚动时出边界的后面的黑色的背景 webView.backgroundColor=[UIColor clearColor]; for (UIView *aView in [webView subviews]) { if ([aView isKindOfClass:[UIScrollView class]]) { [(UIScrollView *)aView setShowsVerticalScrollIndicator:NO]; //右侧的滚动条 (水平的类似) for (UIVi

windows客户端开发--使你的输入框具有拖拽上传的功能

今天谈一天windows客户端拖拽上传功能. 其实主要是拖拽功能,上传是自己实现的. DragAcceptFiles 函数 最重要的就是这个函数了,看看作用: Registers whether a window accepts dropped files 原型: VOID DragAcceptFiles( HWND hWnd, BOOL fAccept ); 参数: hWnd Type: HWND The identifier of the window that is registering

ios 开发日记 9 - 一些 UIView 中管理 Subview 常用的方法

一些 UIView 中管理 Subview 常用的方法 (2013-01-22 10:04:40) 标签: ios subview it 分类: 關于IOS學習 一些 UIView 中管理 Subview 常用的方法 一个 UIView 里面可以包含许多的 Subview(其他的 UIView),而这些 Subview 彼此之间是有所谓的阶层关系,这有点类似绘图软体中图层的概念,下面程式码示演示了几个在管理图层(Subview)上常用的方法,其程式码如下. 首先是大家最常使用的新增和移除 Sub

ios开发日记12-CALayer和UIView

今天博主有一个内容绘制的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 今天和大家分享一下CALayer和UIView的区别: 1.UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理.UIApplication.UIViewController.UIView.和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类. 在 UIResponder中定义了处理各种事件和事件传递的接口, 而 CALay