场景
像上图展示的图片一样,每次用户点击上下左右不同方向的时候,需要向机器人发送指令,其实就是发送一条IM消息。但是要求就是点击下去的时候发送向各个方向行走的指令,当手指脱离的时候发送停止指令,也就是只要手指不松开就不发送停止指令,并且还需要对这个手指点击 离开的时间做判断。一开始闪过的是通过手势,后来仔细想了一下,感觉用手势做的话,添加手势还有手势处理的代码比价多,果断不喜欢。想到用按钮做可能就更好一点,so ,好像看到了一个更好的处理方法。
初步
大多数对于按钮的操作都是如下所示
[_registerBtn addTarget:selfaction:@selector(regiestAction:)forControlEvents:UIControlEventTouchUpInside];
处理最多的是TouchUpInside,然后点进去寻找这个枚举里面更多的内容
排在第一UIControlEventTouchDown,表示当点击的时候就会触发,再加上UIControlEventTouchUpInside的配合正好可以满足这种需求。一个是当手指刚放上去,另一个则是手指离开按钮,并且能够取到这种时间差
因为需要多个按钮 而且每一个都需要做这种处理,要是每一个都是按钮都按照下面那么直白的写法,肯定不行啊!
//手指刚点击按钮 [self addTarget:self action:@selector(pressedEvent:) forControlEvents:UIControlEventTouchDown]; //手指离开按钮 [self addTarget:self action:@selector(pressedEndEvent:) forControlEvents:UIControlEventTouchUpInside];
过程
若是用继承来写的话,感觉这样的做法太重了,而且对于耦合度而言感觉是得不偿失,另外需要注意的这里面还有个需要对这个点击操作持续时间的处理,即从手指放到按钮上到手指离开按钮这段时间。于是就想到了用类别category,顺带可以把按钮的点击事件用block来处理了。不过这里就需要运用到一点runtime的知识了,需要动态的给UIButton添加属性,不过这里不做重点讲述,可以看demo中的具体代码,以后会写相关内容。
objc_setAssociatedObject(self, &pressedKey, pressblock, OBJC_ASSOCIATION_COPY_NONATOMIC); objc_setAssociatedObject(self, &unpressedKey, unpressedblock,OBJC_ASSOCIATION_COPY_NONATOMIC);
pressedBlock block = (pressedBlock)objc_getAssociatedObject(self, &pressedKey); unpressedBlock block = (unpressedBlock)objc_getAssociatedObject(self, &unpressedKey);
//执行点动效果(放大) [UIView animateWithDuration:selfAnimateTime animations:^{ self.transform = CGAffineTransformMakeScale(1.0, 1.0); } completion:^(BOOL finished) { //此处是当按钮的放大动画做完之后可以进行后续的操作 根据自身业务调节 }];
上面为category中的一部分代码,详细流程与代码请到GitHub。
希望小伙伴多一起交流进步😂😂。