最近在修改项目bug的时候发现一个问题,聊天界面中底部的录音按钮,很难被点击到,而且当点击中按钮后,有一秒左右的延迟才会更换highlighted状态图片.
对于这种问题我的分析是:
1. 很难被点击,可能是frame太小,响应范围太小.
苹果建议按钮尺寸不要小于44 不然很难被点击到.
2. 进入highlighted状态有延迟,可能对按钮做了延迟响应处理.
3. 按钮所处的界面层级太深,判断逻辑复杂,造成响应延迟.
最后,如果上面的设想都不是,那就可能是响应事件被拦截.
第一种设想的解决方案: 首先我想到的是响应者链条中的,hitTest方法 和 pointInset方法,参考网上的方法后 使用下面代码对button的响应范围进行了扩展.
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
CGRect bounds = self.bounds;
//若原热区小于44x44,则放大热区,否则保持原大小不变
CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
return CGRectContainsPoint(bounds, point);
}
参考地址链接:https://my.oschina.net/gejw0623/blog/362303
添加代码后,但是并没有解决实际问题.
第二个设想,检查代码后并没有发现做了延迟响应处理,
第三个设想,由于视图是由navigationController push 出来的,所以怀疑可能是 navigation的右滑手势,干扰了点击事件,而且点开图层发现聊天界面是View上加了TableView和ToolBar, 以前遇到过TableViewCell中的button响应延迟的问题. 于是给Navigation和TableView 的delayTouch属性都置为NO.代码如下:
self.navigationController.interactivePopGestureRecognizer.delaysTouchesBegan = NO;
self.tableView.delaysContentTouches = NO;
self.tableView.canCancelContentTouches = YES;
参考文章链接:http://blog.csdn.net/zhangjunjian127/article/details/44925335
后面经过检测与TableView并无关系,仅仅是navigationController的interactivePopGesture手势干扰了touchDown事件.
总结,
因为是接手的项目,后来发现navigationController被加了一个全屏手势,来实现在屏幕的任意一点滑动都可以侧滑返回上一级界面, 而且这个手势的存在导致在录音按钮上拖动时有一定概率触发右滑动作而卡住录音,即使手指松开录音按钮,但仍在继续录音的bug,当我再次关闭这个手势的响应后,又出现了如果在底部 进行手指滑动会触发系统的在屏幕底部的sheet弹框,从而卡住录音.
由此,发现对于UI控件来说,其自身的状态很不稳定,尤其是包含触发事件的响应,很容易被打断,因此最好对于响应事件都将上状态判定,只有在特定状态下实现特定的响应.此想法来源于微信公众号: iOS大全 的一篇文章 文章地址:
http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=2652155441&idx=1&sn=0f39bf0a87954bf31db345758229a730&chksm=8046ce50b731474653b07db4493d38aae79d1fbccd40bb9099934b9235e7228d2820fa168f0d&mpshare=1&scene=1&srcid=1013OHmNy9lsbg0yuwoa1NpQ#rd
.