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) {

}];

}

本文作为学习记录,以便之后查阅。谢谢。

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: