1.在iOS上,事件有多种形式
①触摸事件
②运动事件
③远程控制事件
2.触摸事件的处理方法
//
开启多点触控
self.multipleTouchEnabled = YES;
//
手指点击时,触发的事件
- ( void )touchesBegan:( NSSet *)touches withEvent:( UIEvent *)event
{
// 屏幕上点击手指的个数
NSInteger count = touches. count ;
// NSLog(@"touchesBegan %ld",count);
// 拿到一个点击的对象
UITouch *touch = touches. anyObject ;
UIView *touchView = touch. view ;
NSLog ( @"self---%@ touchView-----%@" , self , touchView); // 同一个
UIWindow *touchWindow = touch. window ;
NSLog ( @"self window-----%@, touchWindow---%@" , self . window , touchWindow); // 同一个
// 拿到点击次数
NSInteger tapCount = touch.tapCount;
// NSLog(@"%ld", tapCount);
if (tapCount == 1 ) {
// NSLog(@" 单击 ");
// 延迟调用
[ self performSelector : @selector (singleTap) withObject : nil afterDelay : 0.5 ];
// [self singleTap];
} else if (tapCount == 2 ){
// NSLog(@" 双击 ");
// 取消某个方法
[ NSObject cancelPreviousPerformRequestsWithTarget : self selector : @selector (singleTap) object : nil ];
[ self doubleTap ];
}
- ( void )touchesBegan:( NSSet *)touches withEvent:( UIEvent *)event
{
// 屏幕上点击手指的个数
NSInteger count = touches. count ;
// NSLog(@"touchesBegan %ld",count);
// 拿到一个点击的对象
UITouch *touch = touches. anyObject ;
UIView *touchView = touch. view ;
NSLog ( @"self---%@ touchView-----%@" , self , touchView); // 同一个
UIWindow *touchWindow = touch. window ;
NSLog ( @"self window-----%@, touchWindow---%@" , self . window , touchWindow); // 同一个
// 拿到点击次数
NSInteger tapCount = touch.tapCount;
// NSLog(@"%ld", tapCount);
if (tapCount == 1 ) {
// NSLog(@" 单击 ");
// 延迟调用
[ self performSelector : @selector (singleTap) withObject : nil afterDelay : 0.5 ];
// [self singleTap];
} else if (tapCount == 2 ){
// NSLog(@" 双击 ");
// 取消某个方法
[ NSObject cancelPreviousPerformRequestsWithTarget : self selector : @selector (singleTap) object : nil ];
[ self doubleTap ];
}
}
//
手指滑动时,触发的事件
- ( void )touchesMoved:( NSSet *)touches withEvent:( UIEvent *)event
{
// NSLog(@"touchesMoved");
// 取到一个 touch 对象
UITouch *touch = touches. anyObject ;
// 拿到当前点击的坐标
CGPoint nowLocation = [touch locationInView : self ];
// 拿到上一次的坐标
CGPoint lastLocation = [touch previousLocationInView : self ];
CGFloat subX = nowLocation. x - lastLocation. x ;
if (subX > 0 ) {
NSLog ( @" 向右 " );
} else if (subX < 0 ){
NSLog ( @" 向左 " );
} else if (subX == 0 ){
NSLog ( @" 垂直 " );
}
- ( void )touchesMoved:( NSSet *)touches withEvent:( UIEvent *)event
{
// NSLog(@"touchesMoved");
// 取到一个 touch 对象
UITouch *touch = touches. anyObject ;
// 拿到当前点击的坐标
CGPoint nowLocation = [touch locationInView : self ];
// 拿到上一次的坐标
CGPoint lastLocation = [touch previousLocationInView : self ];
CGFloat subX = nowLocation. x - lastLocation. x ;
if (subX > 0 ) {
NSLog ( @" 向右 " );
} else if (subX < 0 ){
NSLog ( @" 向左 " );
} else if (subX == 0 ){
NSLog ( @" 垂直 " );
}
}
//
手指结束滑动时,触发的事件
- ( void )touchesEnded:( NSSet *)touches withEvent:( UIEvent *)event
{
NSLog ( @"touchesEnded" );
}
// 手指滑动被中止时
- ( void )touchesCancelled:( NSSet *)touches withEvent:( UIEvent *)event
{
NSLog ( @"touchesCancelled" );
- ( void )touchesEnded:( NSSet *)touches withEvent:( UIEvent *)event
{
NSLog ( @"touchesEnded" );
}
// 手指滑动被中止时
- ( void )touchesCancelled:( NSSet *)touches withEvent:( UIEvent *)event
{
NSLog ( @"touchesCancelled" );
}
//
当子视图超过自己的
frame
是够剪切
self.clipsToBounds = YES;
3.运动事件
- (
void
)motionBegan:(
UIEventSubtype
)motion withEvent:(
UIEvent
*)event
{
NSLog ( @" 开始晃动 " );
}
- ( void )motionEnded:( UIEventSubtype )motion withEvent:( UIEvent *)event
{
NSLog ( @" 结束晃动 " );
{
NSLog ( @" 开始晃动 " );
}
- ( void )motionEnded:( UIEventSubtype )motion withEvent:( UIEvent *)event
{
NSLog ( @" 结束晃动 " );
}
4.事件的传递
iOS——>Application—>window—>子视图
5.响应者链
// 取到视图控制器 从 responder 转过来
// UIViewController *rootVC = (UIViewController *)self.nextResponder.nextResponder.nextResponder;
UIViewController *motailVC = [[ UIViewController alloc ] init ];
motailVC. view . backgroundColor = [ UIColor blueColor ];
// [rootVC presentViewController:motailVC animated:YES completion:nil];
// UIViewController *rootVC = self.viewController;// 此处可用点语法点出来
// 弹出模态视图
// [rootVC presentViewController:motailVC animated:YES completion:nil];
// 导航控制器
[self.viewController.navigationController pushViewController:motailVC animated:YES];
将核心代码写在UIView的类目中
- (
UIViewController
*)viewController
{
// 找到视图的下一个响应者
UIResponder *nextResponder = self . nextResponder ;
// 利用循环找到响应者
do {
// 如果找到的类是视图控制器就跳出
if ([nextResponder isKindOfClass :[ UIViewController class ]]) {
// break;
return ( UIViewController *)nextResponder;
}
// 如果不是就继续找
nextResponder = nextResponder. nextResponder ;
} while (nextResponder); // 如果找到的响应者有值就一直找
// 找不到返回空
return nil ;
{
// 找到视图的下一个响应者
UIResponder *nextResponder = self . nextResponder ;
// 利用循环找到响应者
do {
// 如果找到的类是视图控制器就跳出
if ([nextResponder isKindOfClass :[ UIViewController class ]]) {
// break;
return ( UIViewController *)nextResponder;
}
// 如果不是就继续找
nextResponder = nextResponder. nextResponder ;
} while (nextResponder); // 如果找到的响应者有值就一直找
// 找不到返回空
return nil ;
}
6.手势识别器
UIView
*gestureView = [[
UIView
alloc
]
initWithFrame
:
CGRectMake
(
50
,
50
,
300
,
300
)];
gestureView. multipleTouchEnabled = YES ;
gestureView. backgroundColor = [ UIColor grayColor ];
[ self . view addSubview :gestureView];
/************** 点击手势 *************/
UITapGestureRecognizer *tap1 = [[ UITapGestureRecognizer alloc ] initWithTarget : self action : @selector (tapClick1:)];
// 设置点击的数量
tap1. numberOfTapsRequired = 1 ;
// 设置手指的个数
tap1. numberOfTouchesRequired = 1 ;
// 往 gestureView 上添加手势
[gestureView addGestureRecognizer :tap1];
// 双击
UITapGestureRecognizer *tap2 = [[ UITapGestureRecognizer alloc ] initWithTarget : self action : @selector (tapClick2:)];
tap2. numberOfTapsRequired = 2 ;
[gestureView addGestureRecognizer :tap2];
// 如果参数中的手势触发了,则自身失效
gestureView. multipleTouchEnabled = YES ;
gestureView. backgroundColor = [ UIColor grayColor ];
[ self . view addSubview :gestureView];
/************** 点击手势 *************/
UITapGestureRecognizer *tap1 = [[ UITapGestureRecognizer alloc ] initWithTarget : self action : @selector (tapClick1:)];
// 设置点击的数量
tap1. numberOfTapsRequired = 1 ;
// 设置手指的个数
tap1. numberOfTouchesRequired = 1 ;
// 往 gestureView 上添加手势
[gestureView addGestureRecognizer :tap1];
// 双击
UITapGestureRecognizer *tap2 = [[ UITapGestureRecognizer alloc ] initWithTarget : self action : @selector (tapClick2:)];
tap2. numberOfTapsRequired = 2 ;
[gestureView addGestureRecognizer :tap2];
// 如果参数中的手势触发了,则自身失效
[tap1 requireGestureRecognizerToFail:tap2];
//
点击手势
- ( void )tapClick1:( UITapGestureRecognizer *)tap
{
NSLog ( @" 单击 " );
}
- ( void )tapClick2:( UITapGestureRecognizer *)tap
{
NSLog ( @" 双击 " );
- ( void )tapClick1:( UITapGestureRecognizer *)tap
{
NSLog ( @" 单击 " );
}
- ( void )tapClick2:( UITapGestureRecognizer *)tap
{
NSLog ( @" 双击 " );
}
/**************
轻扫手势
*************/
UISwipeGestureRecognizer *swip = [[ UISwipeGestureRecognizer alloc ] initWithTarget : self action : @selector (swipAction:)];
// 设置方向
swip. direction = UISwipeGestureRecognizerDirectionDown ;
[gestureView addGestureRecognizer :swip];
UISwipeGestureRecognizer *swip = [[ UISwipeGestureRecognizer alloc ] initWithTarget : self action : @selector (swipAction:)];
// 设置方向
swip. direction = UISwipeGestureRecognizerDirectionDown ;
[gestureView addGestureRecognizer :swip];
//
轻扫手势
- ( void )swipAction:( UISwipeGestureRecognizer *)swip
{
if (swip. direction == UISwipeGestureRecognizerDirectionDown )
{
- ( void )swipAction:( UISwipeGestureRecognizer *)swip
{
if (swip. direction == UISwipeGestureRecognizerDirectionDown )
{
NSLog(@"向下滑动");
}
/************** 平移手势 *************/
UIPanGestureRecognizer *pan = [[ UIPanGestureRecognizer alloc ] initWithTarget : self action : @selector (panAction:)];
[gestureView addGestureRecognizer:pan];
//
平移手势
- ( void )panAction:( UIPanGestureRecognizer *)pan
{
CGPoint p = [pan locationInView :pan. view ];
NSLog ( @"%@" , NSStringFromCGPoint (p));
- ( void )panAction:( UIPanGestureRecognizer *)pan
{
CGPoint p = [pan locationInView :pan. view ];
NSLog ( @"%@" , NSStringFromCGPoint (p));
}
/************** 长按手势 *************/
UILongPressGestureRecognizer *longPress = [[ UILongPressGestureRecognizer alloc ] initWithTarget : self action : @selector (longPress:)];
// 最少按住时间
longPress. minimumPressDuration = 2 ;
[gestureView addGestureRecognizer:longPress];
//
长按手势
- ( void )longPress:( UILongPressGestureRecognizer *)longpress
{
NSLog ( @" 长按 " );
- ( void )longPress:( UILongPressGestureRecognizer *)longpress
{
NSLog ( @" 长按 " );
}
/************** 旋转手势 *************/
UIRotationGestureRecognizer *rotation = [[ UIRotationGestureRecognizer alloc ] initWithTarget : self action : @selector (RotationAction:)];
[gestureView addGestureRecognizer:rotation];
//
旋转手势
- ( void )RotationAction:( UIRotationGestureRecognizer *)rotation
{
// 获取旋转的弧度
CGFloat r = rotation. rotation ;
// 弧度转角度
NSLog ( @"%.2f" , 180 / M_PI * r);
- ( void )RotationAction:( UIRotationGestureRecognizer *)rotation
{
// 获取旋转的弧度
CGFloat r = rotation. rotation ;
// 弧度转角度
NSLog ( @"%.2f" , 180 / M_PI * r);
}
/************** 捏合手势 *************/
UIPinchGestureRecognizer *pinch = [[ UIPinchGestureRecognizer alloc ] initWithTarget : self action : @selector (pintchAction:)];
[gestureView addGestureRecognizer:pinch];
- (
void
)pintchAction:(
UIPinchGestureRecognizer
*)pintch
{
// 获得捏合的比例
CGFloat scale = pintch. scale ;
pintch. view . transform = CGAffineTransformMakeScale (scale, scale);
{
// 获得捏合的比例
CGFloat scale = pintch. scale ;
pintch. view . transform = CGAffineTransformMakeScale (scale, scale);
}