UI____UIEvent以及响应者链

本文详细介绍了iOS中触摸事件的处理机制,包括不同触摸状态的方法如begun、moved、ended及cancelled的使用。此外,还解释了为何使用NSSet而非NSArray来处理触摸事件,并探讨了响应者链的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UIEvent:事件,是由硬件捕捉的一个表示用户操作设备的对象:触摸事件;晃动事件;远程控制事件(耳机线控)


如果想要视图能够响应用户触摸,就必须使用UIView的子类.(为什么不直接使用UIView,因为我们拿不到UIView的.m文件,无法对响应做出反应).


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

为什么使用NSSet而不使用NSArray.因为我们也不知道哪个手指会先触摸,而集合刚好是无序的,并且因为集合是无序的,所以遍历起来效率很高


UITouch对应的就是手指类.



//移动触摸:在移动过程中,手指对象不能离开屏幕,同时该方法会被重复调用

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


//将要离开屏幕的时候触发

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


//取消触摸,,当触摸被意外打断的时候触发,比如来电话短信

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


__________________________________________________________________________________________________________________________________________

-----------------------------------------------------------------------------------------------------------------响应者链---------------------------------------------------------------------------------------------------------

回收键盘神器:

    [self.view endEditing:YES];//原理:将自带View上面的所有子视图都取消第一响应者,所以自己上面的子视图textField也随之取消第一响应者.

   这个方法要写在视图控制器里面(因为目的是获得视图控制器自带的视图)





这个视图的布局:

- (void)viewDidLoad {

    [superviewDidLoad];


   Custom *redView = [[Customalloc]initWithFrame:CGRectMake(0,0, self.view.frame.size.width,self.view.frame.size.height/2)];

    [self.viewaddSubview:redView];

    redView.tag =100;

    redView.backgroundColor = [UIColorredColor];

   

    [redViewrelease];

    

    

    Custom *yellowView = [[Customalloc]initWithFrame:CGRectMake(0,self.view.frame.size.height/2,self.view.frame.size.width,self.view.frame.size.height/2)];

    [self.viewaddSubview:yellowView];

    yellowView.tag =101;

    yellowView.backgroundColor = [UIColoryellowColor];

    yellowView.userInteractionEnabled =NO;

    [yellowViewrelease];

    

   Custom *greenView = [[Customalloc]initWithFrame:CGRectMake(DISTANCE,DISTANCE, yellowView.frame.size.width -DISTANCE*2, yellowView.frame.size.height -DISTANCE*2)];

    [yellowViewaddSubview:greenView];

    greenView.backgroundColor = [UIColorgreenColor];

    greenView.tag =102;

    greenView.userInteractionEnabled =NO;

    [greenViewrelease];

    

    

   Custom *blueView = [[Customalloc]initWithFrame:CGRectMake(DISTANCE,DISTANCE, greenView.frame.size.width -DISTANCE*2, greenView.frame.size.height/2)];

    blueView.backgroundColor =  [UIColorblueColor];

    blueView.tag =103;

    blueView.userInteractionEnabled =NO;

    [greenViewaddSubview:blueView];


    [blueViewrelease];

    

    

}


对于事件的处理过程,分别是碰撞检测阶段和事件处理阶段.碰撞检测阶段产生了一个响应者链.

视图的用户交互默认是开启的,如果将视图的用户交互关闭,则视图以及碰撞检测过程中视图和它上面的子视图都无法检测到碰撞事件.

注意 UIlabelUIImageVIew的用户交互默认是关闭的.其余的用户交互默认都是开启的.


事件处理:UIApplication --->AppDelegate--->window--->RootViewController --->self.View(根视图控制器对应的视图) --->yellow--->green--->blue

事件处理的递交过程:事件从blueView开始一层一层往外递交,该过程中一旦有对象对事件作出处理,事件递交工作就会停止.但是如果整个过程都没有对象作出处理,整个事件就会被丢弃掉.


将yellowView的用户交互关掉,则碰撞检测事件在self.View终止,但是事件是被rootViewController作出响应.(因为self.view是一个UIView类型的对象,但是我们拿不到UIView 的.m文件)


内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
<think>首先,用户的问题是关于NX二次开发中的UFun函数:UF_UI_set_sel_procs。用户想知道它的用途和使用方法。系统指令要求我使用中文回答,并且结构清晰。 从系统指令中,我有一些引用:[^1]是关于UF_UI_set_sel_procs的函数介绍,[^2]是关于UF_UI_select_by_class的,但后者将被废弃。用户的问题焦点是UF_UI_set_sel_procs,所以我应该主要参考[^1]。 关键点: - 函数定义:UF_UI_set_sel_procs(UF_UI_selection_p_t select_, UF_UI_sel_filter_fn_t filter_proc, UF_UI_sel_cb_fn_t sel_cb, void * user_data ) - 概述:设置选择过程的回调函数。 我的回答需要: 1. 解释函数的用途:设置选择过程中的过滤器和选择回调函数。 2. 描述参数: - select_:选择对象的指针。 - filter_proc:过滤函数的回调,用于决定哪些对象可以被选择。 - sel_cb:选择回调函数,在选择发生时调用。 - user_data:用户数据指针,传递给回调函数。 3. 使用方法:提供一个简单的示例代码,展示如何实现回调函数并调用UF_UI_set_sel_procs。 4. 系统指令要求生成相关问题,所以我需要在回答后添加相关问题部分。 5. 使用中文回答。 6. 在引用的地方添加引用标识。 结构: - 开头介绍函数的基本信息。 - 详细解释参数。 - 提供示例代码(用代码块)。 - 添加相关问题。 示例代码:由于这是一个C函数,我应该用C或C++写一个简单示例。参考引用[^1],它提到了UFUN例子,所以我应该基于那个。 用户提到“请尽可能多的参考用户上一次的问题和你的回答”,但这是用户的第一条消息,所以没有历史。用户说“我想查找关于UFun函数UF_UI_set_sel_procs的用途和使用方法”,所以我直接回答。 最后,添加相关问题: - 例如,关于其他相关函数、常见错误、性能优化等。 确保LaTeX语法正确:在行内数学表达式中用$...$,独立公式用$$...$$。但在这个主题中,可能没有数学表达式,所以可能不需要。 回答: - 用途:UF_UI_set_sel_procs 函数用于设置选择过程的回调函数,包括过滤器和选择回调,允许自定义选择行为。 - 参数解释: - select_: 指向选择对象的指针。 - filter_proc: 过滤回调函数,用于检查对象是否可被选择。 - sel_cb: 选择回调函数,当对象被选择或取消选择时调用。 - user_data: 用户自定义数据,传递给回调函数。 - 示例:提供一个简单的C代码片段。 - 引用:在解释时引用[^1]。 相关问题: 1. 如何实现一个自定义过滤函数? 2. UF_UI_set_sel_procs 与 UF_UI_select_with_class_dialog 有什么区别? 3. 如何处理选择过程中的错误?</think>### UF_UI_set_sel_procs 函数用途及使用方法 UF_UI_set_sel_procs 是 NX 二次开发(UFun API)中的一个核心函数,用于自定义对象选择过程中的行为。它允许开发者为选择操作设置过滤器和回调函数,从而实现灵活的选择逻辑控制。例如,在交互式设计工具中,限制用户只能选择特定类型的几何体(如仅圆柱体或特定尺寸的零件)。该函数在 `uf_ui.h` 头文件中定义[^1]。 #### 函数原型 ```c int UF_UI_set_sel_procs( UF_UI_selection_p_t select_, // 选择对象的指针 UF_UI_sel_filter_fn_t filter_proc, // 过滤回调函数 UF_UI_sel_cb_fn_t sel_cb, // 选择回调函数 void *user_data // 用户自定义数据指针 ); ``` #### 参数详细说明 1. **`select_`** (类型: `UF_UI_selection_p_t`) - 指向选择对象的指针,通常通过其他选择函数(如 `UF_UI_select_with_class_dialog`)获取。它标识当前选择会话的上下文。 - 示例:`UF_UI_selection_p_t select_obj = ...;`(从选择对话框初始化)。 2. **`filter_proc`** (类型: `UF_UI_sel_filter_fn_t`) - 过滤回调函数,用于检查对象是否可被选择。函数签名如下: ```c typedef logical (*UF_UI_sel_filter_fn_t)( UF_UI_selection_p_t select_, // 选择对象指针 tag_t object, // 待检查对象的 NX 标签 int *response, // 输出响应(1=可选中, 0=不可选) void *user_data // 用户数据 ); ``` - **用途**:实现自定义过滤逻辑(如只允许选择特定图层或类型的实体)。 - 示例:过滤函数只允许选择圆柱体: ```c logical my_filter_proc(UF_UI_selection_p_t select_, tag_t object, int *response, void *user_data) { char type[UF_OBJ_NAME_LEN]; UF_OBJ_ask_type(object, type); *response = (strcmp(type, "CYLINDER") == 0) ? 1 : 0; // 仅圆柱体可选中 return TRUE; } ``` 3. **`sel_cb`** (类型: `UF_UI_sel_cb_fn_t`) - 选择回调函数,当用户选择或取消选择对象时触发。函数签名如下: ```c typedef void (*UF_UI_sel_cb_fn_t)( UF_UI_selection_p_t select_, // 选择对象指针 int event_type, // 事件类型(如 UF_UI_SEL_EVENT_SELECT) tag_t *objects, // 涉及的对象标签数组 int num_objects, // 对象数量 void *user_data // 用户数据 ); ``` - **用途**:响应选择事件(如更新界面或记录日志)。 - 示例:记录被选中的对象标签: ```c void my_sel_cb(UF_UI_selection_p_t select_, int event_type, tag_t *objects, int num_objects, void *user_data) { if (event_type == UF_UI_SEL_EVENT_SELECT) { for (int i = 0; i < num_objects; i++) { printf("Object selected: %d\n", objects[i]); } } } ``` 4. **`user_data`** (类型: `void *`) - 用户自定义数据的指针,传递给过滤器和回调函数。用于传递上下文信息(如配置参数)。 - 示例:传递一个结构体,包含过滤条件: ```c typedef struct { int layer; double min_size; } MyData; MyData data = {10, 5.0}; // 只允许图层10且尺寸>5的对象 ``` #### 使用步骤 1. **初始化选择会话**:先通过其他函数(如 `UF_UI_select_with_class_dialog`)创建选择对象。 2. **设置回调函数**:调用 `UF_UI_set_sel_procs` 绑定过滤器和回调。 3. **执行选择操作**:启动选择对话框,用户交互将触发回调。 4. **清理资源**:选择结束后释放对象。 #### 完整示例代码 以下是一个简单示例,展示如何在 NX 二次开发中使用该函数: ```c #include <uf.h> #include <uf_ui.h> // 自定义过滤函数:仅允许选择圆柱体 logical filter_proc(UF_UI_selection_p_t select_, tag_t object, int *response, void *user_data) { char type[UF_OBJ_NAME_LEN]; UF_OBJ_ask_type(object, type); *response = (strcmp(type, "CYLINDER") == 0) ? 1 : 0; return TRUE; } // 自定义回调函数:记录选择事件 void sel_cb(UF_UI_selection_p_t select_, int event_type, tag_t *objects, int num_objects, void *user_data) { if (event_type == UF_UI_SEL_EVENT_SELECT) { for (int i = 0; i < num_objects; i++) { UF_UI_write_listing_window("Object selected: %d\n", objects[i]); } } } int main() { UF_initialize(); // 初始化 UFun 环境 // 创建选择对象(假设已通过对话框初始化) UF_UI_selection_p_t select_obj; UF_UI_create_selection(&select_obj, "Select Cylinders"); // 设置回调函数 MyData user_data = {10, 5.0}; // 用户数据 UF_UI_set_sel_procs(select_obj, filter_proc, sel_cb, &user_data); // 显示选择对话框(实际中需调用 UF_UI_select_with_class_dialog) UF_UI_do_selection(select_obj); UF_UI_free_selection(select_obj); // 释放资源 UF_terminate(); // 清理 UFun return 0; } ``` #### 注意事项 - **错误处理**:函数返回 `int` 类型,0 表示成功,非 0 表示错误(需检查 UFun 错误码)。 - **性能**:过滤函数应高效,避免复杂计算影响交互响应。 - **替代方案**:引用[^2]提到 `UF_UI_select_by_class` 将被废弃,推荐使用 `UF_UI_select_with_class_dialog` 作为选择入口点。 - **适用场景**:适用于需要动态控制选择行为的应用,如定制化设计工具或自动化测试。 通过以上设置,开发者可以精确控制 NX 中的对象选择流程,提升用户体验和功能灵活性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值