ios中模拟手势单击或是双击

2023-11-03

1.拓展UITouch类和UIEvent类(通过category),具体见附件TouchSynthesis.h和TouchSynthesis.m

2.在需要的类中,定义UITouch和UIEvent类的对象。

UITouch *touch = [[UITouchalloc] initWithPoint:point andView:mapview];

     UIEvent *eventDown = [[UIEventalloc] initWithTouch:touch];

[touch.view touchesBegan:[eventDownallTouches]  withEvent:eventDown];


[touch setPhase:UITouchPhaseEnded];

    UIEvent *eventUp = [[UIEventalloc] initWithTouch:touch];

    [touch.view touchesEnded:[eventUp allTouches] withEvent:eventUp];

    [eventDown release];

    [eventUp release];

     [touch release];


TouchSynthesis.h文件


#import <UIKit/UIKit.h>

@interface UITouch (Synthesize)

- (id)initInView:(UIView *)view;
-(id) initdoubletap:(UIView *)view;
- (id)initWithPoint:(CGPoint)point andView:(UIView*)view;
- (void)setPhase:(UITouchPhase)phase;
- (void)setLocationInWindow:(CGPoint)location;

@end

@interface UIEvent (Synthesize)

- (id)initWithTouch:(UITouch *)touch;

@end

TouchSynthesis.m文件

#import "TouchSynthesis.h"
#import "MyUITouch.h"


@implementation UITouch (Synthesize)

//
// initInView:phase:
//
// Creats a UITouch, centered on the specified view, in the view's window.
// Sets the phase as specified.
//
- (id)initInView:(UIView *)view
{
    NSLog(@"init in view");
    self = [super init];
    if (self != nil)
    {
        CGRect frameInWindow;
        if ([view isKindOfClass:[UIWindow class]])
        {
            frameInWindow = view.frame;
        }
        else
        {
            frameInWindow =
                [view.window convertRect:view.frame fromView:view.superview];
        }
         
        _tapCount = 1;
        _locationInWindow =
            CGPointMake(
                frameInWindow.origin.x + 0.5 * frameInWindow.size.width,
                frameInWindow.origin.y + 0.5 * frameInWindow.size.height);
        _previousLocationInWindow = _locationInWindow;

        UIView *target = [view.window hitTest:_locationInWindow withEvent:nil];

        _window = [view.window retain];
        _view = [target retain];
        _phase = UITouchPhaseBegan;
        _touchFlags._firstTouchForView = 1;
        _touchFlags._isTap = 1;
        _timestamp = [NSDate timeIntervalSinceReferenceDate];
    }
    return self;
}
- (id)initdoubletap:(UIView *)view
{
    NSLog(@"init in view");
    self = [super init];
    if (self != nil)
    {
        CGRect frameInWindow;
        if ([view isKindOfClass:[UIWindow class]])
        {
            frameInWindow = view.frame;
        }
        else
        {
            frameInWindow =
            [view.window convertRect:view.frame fromView:view.superview];
        }
        
        _tapCount = 2;
        _locationInWindow =
        CGPointMake(
                    frameInWindow.origin.x + 0.5 * frameInWindow.size.width,
                    frameInWindow.origin.y + 0.5 * frameInWindow.size.height);
        _previousLocationInWindow = _locationInWindow;
        
        UIView *target = [view.window hitTest:_locationInWindow withEvent:nil];
        
        _window = [view.window retain];
        _view = [target retain];
        _phase = UITouchPhaseBegan;
        _touchFlags._firstTouchForView = 1;
        _touchFlags._isTap = 1;
        _timestamp = [NSDate timeIntervalSinceReferenceDate];
    }
    return self;
}

- (id)initWithPoint:(CGPoint)point andView:(UIView*)view
{
    self = [super init];
    if (self != nil)
    {
        CGRect frameInWindow;
        if ([view isKindOfClass:[UIWindow class]])
        {
            frameInWindow = view.frame;
        }
        else
        {
            frameInWindow =
            [view.window convertRect:view.frame fromView:view.superview];
        }
        
        _tapCount = 1;
        _locationInWindow = point;
        _previousLocationInWindow = _locationInWindow;
        UIView *target = [view.window hitTest:_locationInWindow withEvent:nil];
        _view = [target retain];
        _window = [view.window retain];
        _phase = UITouchPhaseBegan;
        _touchFlags._firstTouchForView = 1;
        _touchFlags._isTap = 1;
        _timestamp = [NSDate timeIntervalSinceReferenceDate];
    }
    return self;
}
//
// setPhase:
//
// Setter to allow access to the _phase member.
//
- (void)setPhase:(UITouchPhase)phase
{
    _phase = phase;
    _timestamp = [NSDate timeIntervalSinceReferenceDate];
}

//
// setPhase:
//
// Setter to allow access to the _locationInWindow member.
//
- (void)setLocationInWindow:(CGPoint)location
{
    _previousLocationInWindow = _locationInWindow;
    _locationInWindow = location;
    _timestamp = [NSDate timeIntervalSinceReferenceDate];
}

@end



//
// GSEvent is an undeclared object. We don't need to use it ourselves but some
// Apple APIs (UIScrollView in particular) require the x and y fields to be present.
//
@interface GSEventProxy : NSObject
{
@public
    unsigned int flags;
    unsigned int type;
    unsigned int ignored1;
    float x1;
    float y1;
    float x2;
    float y2;
    unsigned int ignored2[10];
    unsigned int ignored3[7];
    float sizeX;
    float sizeY;
    float x3;
    float y3;
    unsigned int ignored4[3];
}
@end
@implementation GSEventProxy
@end

//
// PublicEvent
//
// A dummy class used to gain access to UIEvent's private member variables.
// If UIEvent changes at all, this will break.
//
@interface PublicEvent : NSObject
{
@public
    GSEventProxy           *_event;
    NSTimeInterval          _timestamp;
    NSMutableSet           *_touches;
    CFMutableDictionaryRef  _keyedTouches;
}
@end

@implementation PublicEvent
@end

@interface UIEvent (Creation)

- (id)_initWithEvent:(GSEventProxy *)fp8 touches:(id)fp12;

@end

//
// UIEvent (Synthesize)
//
// A category to allow creation of a touch event.
//
@implementation UIEvent (Synthesize)

- (id)initWithTouch:(UITouch *)touch
{
    CGPoint location = [touch locationInView:touch.window];
    GSEventProxy *gsEventProxy = [[GSEventProxy alloc] init];
    gsEventProxy->x1 = location.x;
    gsEventProxy->y1 = location.y;
    gsEventProxy->x2 = location.x;
    gsEventProxy->y2 = location.y;
    gsEventProxy->x3 = location.x;
    gsEventProxy->y3 = location.y;
    gsEventProxy->sizeX = 1.0;
    gsEventProxy->sizeY = 1.0;
    gsEventProxy->flags = ([touch phase] == UITouchPhaseEnded) ? 0x1010180 : 0x3010180;
    gsEventProxy->type = 3001;    
    
    //
    // On SDK versions 3.0 and greater, we need to reallocate as a
    // UITouchesEvent.
    //
    Class touchesEventClass = objc_getClass("UITouchesEvent");
    if (touchesEventClass && ![[self class] isEqual:touchesEventClass])
    {
        [self release];
        self = [touchesEventClass alloc];
    }
    
    self = [self _initWithEvent:gsEventProxy touches:[NSSet setWithObject:touch]];
    if (self != nil)
    {
    }
    return self;
}

@end

MyUITouch.h文件
#import <Foundation/Foundation.h>

#ifdef __IPHONE_6_0
@interface UITouch () {
    NSTimeInterval _timestamp;
    UITouchPhase _phase;
    UITouchPhase _savedPhase;
    NSUInteger _tapCount;
    
    UIWindow *_window;
    UIView *_view;
    UIView *_gestureView;
    UIView *_warpedIntoView;
    NSMutableArray *_gestureRecognizers;
    NSMutableArray *_forwardingRecord;
    
    CGPoint _locationInWindow;
    CGPoint _previousLocationInWindow;
    UInt8 _pathIndex;
    UInt8 _pathIdentity;
    float _pathMajorRadius;
    struct {
        unsigned int _firstTouchForView:1;
        unsigned int _isTap:1;
        unsigned int _isDelayed:1;
        unsigned int _sentTouchesEnded:1;
        unsigned int _abandonForwardingRecord:1;
    } _touchFlags;
}
@end
#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios中模拟手势单击或是双击 的相关文章

  • iOS 15 适配踩坑:NavigationBar、UITabBar失效问题

    苹果前两天推出了iOS 15 秋天都等不及 相关链接 ios 15 0 适配问题 NavigationBar和UITabBar失效问题 Xcode 13 beta版 iOS 15 beta 3的系统 除了客户提出的问题 自己还发现了两处UI
  • objc学习笔记-基础

    1 xcode 4 3 3以后 NSAutoreleasePool 的用法发生改变 由 NSAutoreleasePool pool NSAutoreleasePool alloc init pool drain 变为 autoreleas
  • xxx.app已损坏,打不开。 您应该将它移到废纸篓。

    Mac最新的系统打开网上下载的应用程序时 会提示 xxx app已损坏 打不开 您应该将它移到废纸篓 解决方式 1 系统偏好设置 gt 安全性与隐私 gt 修改为任何来源 2 serria里面没有 任何来源 这一项 需要打开终端执行sudo
  • Xcode项目设置项中的LLVM

    LLVM是构架编译器
  • windows下expect使用小结

    最近因为学习tcl脚本语言 需要用到expect扩展包 结合网上的资料和自己的学习情况做一下整理 expect是一种基于TCL的解释型脚本语言 能够实现自动和交互式任务进行通信 而无需人的干预 expect由一系列expect send对组
  • 我使用过的Linux命令之stty - 显示和修改终端行设置

    原文链接 http codingstandards iteye com blog 826924 用途说明 stty命令用于显示和修改终端行设置 change and print terminal line settings 常用参数 stt
  • APP开发如何批量生成不同尺寸的图标?

    在我们开发APP的时候 我们使用到大量的不同尺寸的APPLogo的图片 如下图 通常 我们的做法是和设计师沟通 让他们切出这儿所以的图片 然后我们一个一个图片放在对应的位置 这样处理的话 我们比较容易出错 比如说 图片的格式 苹果对图片的格
  • APNS编程----iOS真机测试消息推送

    一 准备工作 1 拥有一台iOS为操作系统的苹果设备 iPhone iPad iPod都可以 2 拥有苹果开发者账号 需要真机调试 最好是是付费开发者 后面的步骤将会更顺利 3 需要一台PC做推送服务器 如果是台拥有MAC OS系统 将会更
  • iOS图标(AppIcon)与启动图(LaunchImage)

    图标 AppIcon 与启动图 LaunchImage 是开发iOS应用程序必不可少的内容 但是在网络上对于这部分的内容讲解的并不详细 所以花些时间写了这篇文章 希望有需要的朋友可以随时查看 想知道AppIcon与LaunchImage的原
  • 对手机制造行业供应链系统的一些需求的情景模拟分析

    手机制造行业供应链系统的一些需求的情景模拟分析 一 关键应用列表 关键应用点 管理诉求简述 终端客户的发运管理 客户代管库的管理 在对大的代理商销售过程中 和代理商签订合同后 需要分批分次发运到代理商的各零售终端去 同时还要对未发运部分进行
  • iOS App上架流程

    前言 作为一名IOS开发者 把开发出来的App上传到App Store是必须的 下面就来详细介绍下具体流程 1 打开苹果开发者中心 https developer apple com 打开后点击 Member Center 如果你的电脑没有
  • 《银河麒麟高级服务器操作系统V10》使用

    一言而论 讲了麒麟服务器V10的基本使用 包括终端 VNC 文章目录 前言 基本架构 环境 硬件环境 软件环境 麒麟安装步骤 1 在宿主机上安装好VM 并且激活 2 使用VM创建虚拟机 3 启动虚拟机 终端常用点 VNC的使用 麒麟上安装V
  • Ubuntu16.04下使用python3,pycharm 安装django

    这里做个总结吧 一直用Ubuntu终端安装django老是安装不上去 我用的是Ubuntu16 04 里面有python2 7 和python3 5两个版本 注意 如果没有更改默认python版本的话 安装pip 直接使用 命令 sudo
  • truss 命令

    truss 命令用途跟踪进程的系统调用 动态装入的用户级函数调用 接收的信号和造成的机器故障 语法truss f c a l d D e i t x Syscall s Signal m Fault r w FileDescriptor u
  • vi的复制粘贴命令

    vi编辑器有3种模式 命令模式 输入模式 末行模式 掌握这三种模式十分重要 命令模式 vi启动后默认进入的是命令模式 从这个模式使用命令可以切换到另外两种模式 同时无论在任何模式下只要按一下 Esc 键都可以返回命令模式 在命令模式中输入字
  • 【IOS 开发学习总结-OC-4】objective-c 运算符

    运算符是用于数据运算 赋值和比较等的特殊符号 objective c 语言中的运算符有以下几种 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 类型相关运算符 算术运算符 有7个基本运算符 加法运算符 减法运算符 还可以作为负号使
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • iOS开发,tableView中cell的重用详解

    注意 原创版权 转载必须标明出处作者 翻版必究 iOS中tableView是一个大的模块组件 它的重要性每个iOSCoder都是了解的 但是tableView中却有个重大的坑 就是cell的重用 每个刚接触iOS开发的人都深受其海 那么经过
  • linux terminal终端操作默认是emacs模式,可以设置为vim操作模式

    在linux终端里输入 set o vi 操作行为与vim一致 默认是insert模式 比如上一个命令 在esc之后 直接k就可以
  • 自定义modal转场动画,滑动手势控制 dismiss 过程

    效果 假设有 1 两个视图控制器 presentingVC presentedVC 2 一个继承于UIPercentDrivenInteractiveTransition 并遵守协议UIViewControllerAnimatedTrans

随机推荐

  • C++day3(设计一个Per类,类中包含私有成员:姓名、年龄...)

    1 设计一个Per类 类中包含私有成员 姓名 年龄 指针成员身高 体重 再设计一个Stu类 类中包含私有成员 成绩 Per类对象 p1 设计这两个类的构造函数 析构函数和拷贝构造函数 include
  • 力扣(LeetCode)257. 二叉树的所有路径

    给定一个二叉树 返回所有从根节点到叶子节点的路径 说明 叶子节点是指没有子节点的节点 示例 输入 1 2 3 5 输出 1 gt 2 gt 5 1 gt 3 解释 所有根节点到叶子节点的路径为 1 gt 2 gt 5 1 gt 3 通过次数
  • L1-003 个位数统计

    给定一个 k 位整数 N dk 1 10k 1 d1 101 d0 0 di 9 i 0 k 1 dk 1 gt 0 请编写程序统计每种不同的个位数字出现的次数 例如 给定 N 100311 则有 2 个 0 3 个 1 和 1 个 3 输
  • win 10升级后不能访问服务器文件夹,Win10系统文件夹无法访问拒绝访问怎么办?...

    不知道大家是否遇到过 访问某些文件夹的时候 出现提示 无法访问拒绝访问该文件夹 那么 Win10系统文件夹无法访问拒绝访问怎么办呢 下面 我们就一起往下看看Win10系统文件夹无法访问拒绝访问的解决方法 方法 步骤 1 右键点击无权访问的文
  • layui向body添加html_layui添加动态菜单与选项卡 AJAX请求的例子

    如下所示 HTMLLayui index js layui use element function function checkLastItem arr i return arr length i 1 function getAhtml
  • Jenkins学习篇之在Jenkins上配置kubernetes

    Jenkins是现在比较成熟的CICD管理平台 官方提供了丰富的插件用来配置CICD流程 这篇博客 记录一下在Jenkins上配置kubernetes的过程 希望对你有帮助 一 安装kubernetes插件 1 在插件管理里面搜索kuber
  • Spring Cloud中间件

    一 Nacos Ribbon Nacos介绍请参考 什么是 Nacos 下载 https github com alibaba nacos releases page 3 安装方法 Nacos 快速开始 运行nacos 切换到bin目录 在
  • 计算机基础知识及其能力调查问卷,大学新生计算机能力调查和分析.doc

    大学新生计算机能力调查和分析 大学新生计算机能力调查和分析 摘 要 本文在分析我院来自不同地区大学新生计算机能力存在较大差异的基础上 介绍了新生计算机能力调查问卷的设计方法 对我院2008级新生的调查结果作了具体分析 并提出了相应教改措施
  • 数据结构与算法分析 C语言描述(原书第2版)电子书pdf下载

    数据结构与算法分析 C语言描述 原书第2版 下载链接 https pan baidu com s 1VrsrvtCujFHbseuJjXJACA 提取码获取方式 关注下面微信公众号 回复关键字 1136
  • TypeScript入门-9.函数箭头表达式

    箭头表达式是function 匿名函数的简写 旨在解决javascript的this指向问题 写函数的时候也更简洁 函数一个参数的时候小括号可以不 写 写在一行后面的大括号可以不写 return也可以不写 如果写了大括号就必须加上retur
  • 【华为OD机试真题2023 JS】寻找核酸检测点

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找核酸检测点 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 张三要去外地出差 需要做核酸 需要在指定时间点前做完核酸 请帮他找到满足条件的核酸检测点 1 给出
  • jenkinsci/blueocean:latest

    Jenkins maven配置 MVN3 mvn clean package Dmaven test skip true Dmaven javadoc skip true Javadoc 用于描述类或者方法的作用 Javadock可以写在类
  • 嵌入式Qt开发—Excel表格数据导出

    有一个嵌入式Excel表格数据导出的需求 应用软件运行于嵌入式Linux平台上 在设备运行过程中 存储了许多数据 这些数据想以表格的形式导出 考虑到Windows平台的普遍性 需要将数据以excel表格形式导出 故选择了一个开源库 QtXl
  • IJCAI 2023 直播预告

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 15 00 15 20 廖馨婷 基于双曲空间探索的非独立同分布联邦学习 15 20 15 40 吴南楠 面向不平
  • 【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列

    1 什么是阻塞队列 阻塞队列常用于生产者和消费者的场景 生产者是向队列里添加元素的线程 消费者是 从队列里取元素的线程 阻塞队列就是生产者用来存放元素 消费者用来获取元素的容器 阻塞队列 BlockingQueue 是一个支持两个附加操作的
  • jQuery 入门教程(27): jQuery UI Button示例(二)

    本例为使用jQuery的一个实用的例子 显示媒体播放器的控制条 其中按钮的图标使用jQuery库自带的CSS定义的一些图标 比如ui icon seek end等 1 2
  • awk 入门 —— 强大的文本分析工具

    awk 是用于 Unix 和类 Unix 系统的强大文本解析工具 但是由于它有可编程函数 因此你可以用它来执行常规解析任务 因此它也被视为一种编程语言 你可能不会使用 awk 开发下一个 GUI 应用 并且它可能不会代替你的默认脚本语言 但
  • 【转载】sp_spaceused2,看库里全部表占用的物理空间

    我常用sp spaceused来查看表所占的空间大小 可是一次只能看一个对象的 今天有空写了个sp spaceused2 可以同时看全部表的空间大小 use master go EXEC sp addmessage msgnum 55000
  • 企业在数字化转型,数据化运营上遇到了哪些困境,如何解决?

    公司决策者意识到成功的数字体验越来越重要 调查受访者表示 这种成功的衡量标准是 用户体验和满意度提高 53 市场敏捷性提高 49 收入和盈利能力增加 49 员工生产力提高 49 以及更快的上市时间 48 然而 数字战略的失败原因是由于系统各
  • ios中模拟手势单击或是双击

    1 拓展UITouch类和UIEvent类 通过category 具体见附件TouchSynthesis h和TouchSynthesis m 2 在需要的类中 定义UITouch和UIEvent类的对象 UITouch touch UIT