当前位置: 首页 > news >正文

iOS开发-处理UIControl触摸事件TrackingWithEvent

IOS BUG记录 之 处理UIControl的点击事件。

UIControl的触摸事件的方法是beginTrackingWithTouch:withEvent:,continueTrackingWithTouch:withEvent:,endTrackingWithTouch:withEvent:,cancelTrackingWithEvent:

##下面简单的介绍一下

  • beginTrackingWithTouch:withEvent:是控件被拖动,让其进入高亮状态;
  • endTrackingWithTouch:withEvent:结束触摸,取消高亮,恢复状态。
  • continueTrackingWithTouch:withEvent:手指移动过程。
  • cancelTrackingWithEvent: 取消触摸,取消高亮,恢复状态。

今天遇到一个问题BUG,当点击时直接移开手指时要求被点击的控件变小后恢复状态;还需要长时间触摸在该控件上,手指不移开的时候,控件一直保持在变小的状态,一段时间移开手指时控件恢复正常的状态,以便响应用户的操作。

使用的控件继承UIControl

##第一种情况:当点击时直接移开手指时要求被点击的控件变小后恢复状态;

点击触发事件问题,UIControlEventTouchUpInside

        [view addTarget:self action:@selector(viewClicked:) forControlEvents:UIControlEventTouchUpInside];

点击事件的方法

        - (void) viewClicked:(id)sender {DFBaseView *view = (DFBaseView *)sender;view.userInteractionEnabled = NO;__weak typeof(view) weakView = view;__weak typeof(self) weakSelf = self;[view didSelectedAnimation:^{__strong typeof(weakSelf) strongSelf = weakSelf;__weak typeof(weakView) strongView = weakView;//todo somethingstrongView.userInteractionEnabled = YES;}];
}

点击的时候的动画处理,先变小后恢复

        - (void)didSelectedAnimation:(void (^) (void))block {[UIView animateWithDuration:0.15 animations:^{self.layer.transform = CATransform3DMakeScale(kTransformScale, kTransformScale, 1);} completion:^(BOOL finished) {[UIView animateWithDuration:0.15 animations:^{self.layer.transform = CATransform3DMakeScale(1.0, 1.0, 1);} completion:^(BOOL finished) {self.animationHighlighted = NO;block();}];}];
}

从上面的代码,我们可以看出,是UIControl的点击事件,动画结束后回调block,之后//todo something 如push跳转等操作。

##第二种情况:长时间触摸在该控件上,手指不移开的时候,控件一直保持在变小的状态,一段时间移开手指时控件恢复正常的状态。

这个时候上面的代码就满足不了了,需要实现如下的几个方法

  • (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event;
  • (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event; // touch is sometimes nil if cancelTracking calls through to this.
  • (void)cancelTrackingWithEvent:(nullable UIEvent *)event; // event may be nil if cancelled for non-event reasons, e.g. removed from window

具体实现

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {[UIView animateWithDuration:0.15 animations:^{self.layer.transform = CATransform3DMakeScale(kTransformScale, kTransformScale, 1);} completion:^(BOOL finished) {}];return [super beginTrackingWithTouch:touch withEvent:event];
}- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {return [super continueTrackingWithTouch:touch withEvent:event];
}- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {[super endTrackingWithTouch:touch withEvent:event];[UIView animateWithDuration:0.15 animations:^{self.layer.transform = CATransform3DMakeScale(1.0, 1.0, 1);} completion:^(BOOL finished) {}];
}- (void)cancelTrackingWithEvent:(UIEvent *)event {[super cancelTrackingWithEvent:event];[UIView animateWithDuration:0.15 animations:^{self.layer.transform = CATransform3DMakeScale(1.0, 1.0, 1);} completion:^(BOOL finished) {}];
}

学习记录,每天不停进步。

http://www.lryc.cn/news/122621.html

相关文章:

  • 学无止境·运维高阶⑤(LVS-DR 群集 配置Nginx负载均衡)
  • badger的mainfest文件解读
  • java导出excel浏览器下载,单线程VS多线程
  • 【rust/egui】(二)看看template的main函数:日志输出以及eframe run_native
  • Eigen在QT中的配置
  • 微服务04-elasticsearch
  • uniapp 微信小程序 订阅消息
  • JDK8日期时间工具类
  • 智汇云舟入选IDC《中国智慧城市数字孪生技术评估,2023》报告
  • 《Zookeeper》源码分析(九)之选举通信网络
  • JVM——栈和堆概述,以及有什么区别?
  • 恒盛策略:沪指冲高回落跌0.26%,酿酒、汽车等板块走弱,燃气股拉升
  • Mongodb 常用操作
  • 【python】-【】
  • 基于Elman神经网络的电力负荷预测
  • LeetCode 0088. 合并两个有序数组
  • 定义行业新标准?谷歌:折叠屏手机可承受20万次折叠
  • 在vscode中配置C/C++环境GCC on Linux
  • windows执行完LoadLibrary()后,可以删除源动态库文件,函数不会锁库文件
  • ios 知识
  • 8 | 美国航班数据分析
  • app.use(express.json()) 使用
  • 基于PyTorch的图像识别
  • js合并数组对象(将数组中具有相同属性对象合并到一起,组成一个新的数组)
  • Spring BeanPostProcessor 接口的作用和使用
  • Android 13 Hotseat定制化修改——006 hotseat图标禁止移动到Launcher中
  • RabbitMQ 发布确认机制
  • 微信小程序使用rich-text解析富文本字符串的时候,遇到image标签图片很大超过屏幕
  • 使用IIS服务器部署Flask python Web项目
  • sentinel核心流程源码解析