iOS UIButton 的 touchDown 事件

anhao
  • 11

我的app是一个很普通的tabbar里嵌套navigationController的结构,里面要实现一个类似微信语音聊天的界面,那么我做了一个简易的底部栏用来放键盘输入和语音输入切换。
在我实现语音按钮输入的时候,我给button添加了不同touchEvent的回调

[longPressButton addTarget:self action:@selector(buttonTouchDown) forControlEvents:UIControlEventTouchDown];

[longPressButton addTarget:self action:@selector(buttonTouchUpInside) forControlEvents:UIControlEventTouchUpInside];

...
等几个event,用来显示不同状态下的语音提示。
现在问题就是button的UIControlEventTouchDown事件在手指按上去时不会触发,而当手指稍微滑动一下,才会触发。或者手指很快触碰然后拿开,会看到touchDown 和touchUpInside都触发了。

我一开始以为是和这个帖子一个问题:

http://www.cocoachina.com/bbs/read.php?tid=142527

但试过也没有解决。应该不是5楼说的问题,我就做了个小demo,发现3.5-inch屏幕没有问题,4-inch屏幕会出现问题,而且肯定是和tabbar有关系。
我把低栏的position移到中间一点,就不会出现上面的问题,把低栏放在tabbar的位置,就会出现。
而且我换过自己重写touchBegin方法,结果是和event事件一样不会触发。
圈子里一定有很多朋友做过类似的IM功能,所以希望能指点一二,我把例子代码放到附件了。

update:
图片描述
我用reveal打开运行时的view hierarchy,发现底部的button没有被任何层遮住,还有一个现象很奇怪,仔细观察能发现,代码例子中在底部的button,touch处于屏幕左半部分是会有上述的问题的,touchBegin不响应,需要移动才响应,但button在屏幕的右半部分touch是ok的,就是会有些延迟,希望高手能帮我解决这个问题。

回复
阅读 13.8k
7 个回答
✓ 已被采纳

我没有确切的证据,但根据你的描述,我猜测是这样的。

Tabbar的点击区域是大于可见区域的,至少高出10个像素左右。如图绿色区域是点击区域,明显高出可视区域。

图片描述

而Cocoa的点击事件是从下向上传递的,所以你的Tabbar在最下边,一定是先拦截到点击。

至于解决方案,我觉得两个办法,一个是把你的Bar在做大一点,大到即使被Tabbar盖掉10个像素仍然很容易点中;另一个就是重写Tabbar。

会不会是线程阻塞了,当touchUpInside的时候有回到了主线程,所以相应了之前一直阻塞的TouchDown的事件,所以出现了刚开始不相应,后来相应两个动作的情况,如果有可能的话,看看是不是多线程上出现了问题。

你好,我下载了你在 git 上的 demo 代码。不过 tab 两边进去,点击按钮都会打 Log:buttonTouchDown。可以描述一下你期待的效果是什么样的吗?在哪个版本、哪种屏幕尺寸上重现?

進撃的技術者
  • 325

你那堆event可以看做一个手势,你的按下抬起都是手势的组成事件。缺失动作会导致手势判断不完全,从而无法触发某个事件。
你需要的是重写下面的回调方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

另外触发不灵敏的问题可能是触发范围太小,触摸面积的电平值打不到阈值,毕竟标准要求44个像素的面积。

yangg
  • 1
新手上路,请多包涵

请问后面怎么解决的,我夜遇到这个问题。。。貌似以上的都没有效果啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏