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

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

相关推荐
思盛iOS签名上架3 小时前
App苹果签名有什么作用?
macos·ios·cocoa
CocoaKier5 小时前
Facebook广告后台收不到Adjust回传数据,我们排查了一个月终于找到了根因
ios·facebook
MartinYeung56 小时前
[论文学习]MAC:多智能体宪章学习
人工智能·学习·macos
greasyfork7 小时前
Mac Sketch v2026.3 矢量图设计工具
macos·ui·sketch
无定义_11 小时前
萌新联赛(六)
macos·objective-c·cocoa
风安•辛幸21 小时前
mac上微信最新v4以上版客户端多开教程,亲测可用
macos·微信
weixin_531670891 天前
Interlude起来:动作动画和文字通知哪个更适合休息提醒?Mac上有没有用桌宠做动作引导的软件?
人工智能·macos·mac·swift
FairGuard手游加固1 天前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
思盛iOS签名上架1 天前
iOS企业签名原理是什么?
macos·ios·cocoa
Daniel_Coder1 天前
我用 SwiftUI + GRDB 做了一个「按时吃药·服药提醒」App
ios·swiftui·swift·widgetkit