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 something
        strongView.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) {
    }];
}

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

相关推荐
ii_best5 分钟前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
centor1 小时前
国际版 UnitySetup-Android-Support 安装 Mac 设备
android·macos
旭日跑马踏云飞2 小时前
【Mac】实用技巧-在新窗口中打开当前文件夹
macos
先飞的笨鸟2 小时前
2026 年 Expo + React Native 项目接入微信分享完整指南
前端·ios·app
初级代码游戏3 小时前
iOS开发 SwiftUI 5 : 文本输入 密码输入 多行输入
ios·swiftui·swift
iosTiov3 小时前
ios生态的分发密钥:企业签、V3签、TF签深度解析与选型指南
安全·ios·团队开发·苹果签名·稳定
林疏safe4 小时前
CAD2026最新mac的安装教程收集免费分享
macos
Digitally4 小时前
如何高效安全地将 iPhone 与 Mac 同步
安全·macos·iphone
程序员允诺4 小时前
办公 WiFi 二次隔离下的远程桌面解决方案实践(Mac → Win11)
macos
00后程序员张4 小时前
在 iPhone 上进行 iOS 网络抓包的实践经验
android·ios·小程序·https·uni-app·iphone·webview