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
具体实现文章来源:https://www.toymoban.com/news/detail-540684.html
- (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) {
}];
}
本文作为学习记录,以便之后查阅。谢谢。文章来源地址https://www.toymoban.com/news/detail-540684.html
到了这里,关于IOS BUG 处理UIControl触摸事件TrackingWithEvent的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!