IOS之触摸与手势

一、触摸事件的处理方式
1.在IOS上,事件有多种形式:触摸事件,运动事件,远程控制事件。
2.触摸事件的处理方法
响应者类通过复写以下方法,可以监听触摸事件
(1)当一个或者多个手指触摸屏幕时:
- (void)touchesBegan:(NSSet *)touches withEvent:
(2)当一个或多个手指在屏幕上移动时:
- (void)touchesMoved:(NSSet *)touches withEvent:
(3)当一个或者多个手指离开屏幕时:
- (void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event;
(4)当触摸序列被系统事件(诸如电话呼入)所取消时:
- (void)touchesCancelled:(NSSet *)touches withEvent:


- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //1.是否响应交互事件,默认为yes,UIImageView默认no
        //self.userInteractionEnabled = NO;

        //2.多点触摸,默认是no
        self.multipleTouchEnabled= YES;

    }
    return self;
}

----------

//1.触摸开始(当用户触摸屏幕时调用视图如下方法)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //UITouch --- 手指头的个数,一个touch表示一根手指(触摸点)
    //NSSet集合,保存UITouch对象,有几个触摸点,set里面就有几个触摸对象

    //点击的次数
    UITouch *touch = [touches anyObject];
    NSLog(@"tap count :%ld",touch.tapCount);

    //触摸的阶段,触摸事件在屏幕上有一个周期,即触摸开始、移动、结束和中途取消。而通过phase可以查看当前触摸事件在一个周期中所处的状态。
    NSLog(@"phase :%ld",touch.phase);

    //在视图上的位置坐标,这里返回的位置是针对VIEW的坐标系
    CGPoint point = [touch locationInView:self];
    NSLog(@"location in View:%@",NSStringFromCGPoint(point));

    //在window上的位置
    CGPoint windowPoint = [touch locationInView:[UIApplication sharedApplication].keyWindow];
    NSLog(@"location in window :%@",NSStringFromCGPoint(windowPoint));

    //在视图上前一个点的坐标
    CGPoint prepoint = [touch previousLocationInView:self];
    NSLog(@"previouslocation in preview :%@",NSStringFromCGPoint(prepoint));


}

----------

//2.触摸移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    //在视图上的位置坐标
    CGPoint point = [touch locationInView:self];
    NSLog(@"location in View:%@",NSStringFromCGPoint(point));

    //在视图上前一个点的坐标
    CGPoint prepoint = [touch previousLocationInView:self];
    NSLog(@"previouslocation in preview :%@",NSStringFromCGPoint(prepoint));

    //触摸的阶段
    NSLog(@"phase :%ld",touch.phase);

}

----------

//3.触摸结束
//- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    UITouch *touch = [touches anyObject];
//    //触摸的阶段
//    NSLog(@"phase :%ld",touch.phase);
//}
//触摸取消,一般用不到
//- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

@end

eg:下面介绍一个处理轻击事件的Demo:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(20, 20, 100, 100);
    [button setTitle:@"ClickAction" forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(buttonAction:)
     forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

}
----------
- (void)buttonAction:(UIButton *)btn
{
    NSLog(@"action");
}
----------
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if (touch.tapCount == 1)//单机
    {
        [self performSelector:@selector(singleTap)
                   withObject:nil
                   afterDelay:.2];
    }else if (touch.tapCount == 2)//双击
    {

        //*先取消单机,这一点很重要*
        [NSObject cancelPreviousPerformRequestsWithTarget:self
                                                 selector:@selector(singleTap)
                                                   object:nil];
        [self doubleTap];
    }       
}


----------

- (void)singleTap
{
    NSLog(@"单击");
}

- (void)doubleTap
{
     NSLog(@"双击");
}

2.运动事件

  • (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
  • (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
  • (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
    3.远程控制:(比如耳机线按钮控制音乐播放)
  • (void)remoteControlReceivedWithEvent:(UIEvent *)event;

二、事件传递的过程
这里写图片描述
这里写图片描述

三、响应者链
响应者对象是一个能接受并处理事件的对象。UIResponser是所有响应者对象的基类。
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一响应者(next responder)。
下面是一个next responder的view的类目

#import "UIView+ViewController.h"

@implementation UIView (ViewController)

- (UIViewController *)viewController
{
    id next = [self nextResponder];
    while (next != nil) {

        if ([next isKindOfClass:[UIViewController class]]) {
            UIViewController *viewCtrl = next;
            return viewCtrl;
        }

        next = [next nextResponder];
    }
    return nil;
}

@end

四、手势识别器
UIGestureRecognizer类是用于检测和识别用户使用设备时所用的手势。它是一个抽象类,定义了所有手势的基本行为。以下是UIGestureRecognizer子类,用于处理具体的用户手势行为:

UITapGestureRecognizer(轻击)
UIPinchGestureRecognizer(捏合)
UIPanGestureRecognizer(平移)
UISwipeGestureRecognizer(清扫)
UILongPressGestureRecognizer(长按)
UIRotationGestureRecognizer(旋转)

其中注意的是区别两种手势(一只手单击、双击)

这里写图片描述
eg:

  //一只手单击
    UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapOnce)];
    tap1.numberOfTapsRequired = 1;
    tap1.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tap1];

 //一只手双击
    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapTwice)];
    tap2.numberOfTapsRequired = 2;
    tap2.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tap2];
    [tap1 requireGestureRecognizerToFail:tap2];
----------
   //两只手单击
    UITapGestureRecognizer *tap3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapOnce)];
    tap3.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:tap3];

    //两只手双击
    UITapGestureRecognizer *tap4 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapTwice)];
    tap4.numberOfTapsRequired = 2;
    tap4.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:tap4];

    //区别两种手势
    [tap3 requireGestureRecognizerToFail:tap4];
----------
     //一只手向右轻扫
    UISwipeGestureRecognizer *swip2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swip2Action)];
    swip2.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swip2];   
----------  
    //捏合手势
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];

    [self.view addGestureRecognizer:pinch];
----------
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
    [self.view addGestureRecognizer:longPress];
----------
//长按手势
- (void)longPressAction:(UILongPressGestureRecognizer *)sender
{
     NSLog(@"长按");
    if (sender.state == UIGestureRecognizerStateBegan)
    {
        NSLog(@"开始");
    }else if (sender.state == UIGestureRecognizerStateChanged)
    {
        NSLog(@"移动");
    }else if (sender.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"结束");
    }
}

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性控制机制;同时,该模拟器可用于算法验证、控制器设计教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习仿真验证;②作为控制器(如PID、LQR、MPC等)设计测试的仿真平台;③支持无人机控制系统教学科研项目开发,提升对姿态控制系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、数学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习仿真实践的参考资料,帮助理解分布式优化模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值