如何让自定义UISearchBar内的suggestionTableView响应点击触摸事件
问题解决方法
根因说明
你将suggestionTableView的顶部约束对齐SuggestionSearchBar的底部,导致整个下拉列表完全处于SuggestionSearchBar自身的bounds范围之外。iOS默认的事件传递机制会忽略父视图bounds外的子视图触摸事件,所以点击下拉列表时事件会直接穿透到下层视图,无法被tableView接收。
修复代码
只需要在SuggestionSearchBar类中重写hitTest方法即可,实现逻辑如下:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { // 过滤掉当前视图无响应能力的情况 guard !isHidden, isUserInteractionEnabled, alpha > 0.01 else { return nil } // 将点击坐标转换为tableView内部的坐标 let tableViewConvertPoint = convert(point, to: suggestionTableView) // 判断点击是否落在tableView的可见区域内 if suggestionTableView.bounds.contains(tableViewConvertPoint), !suggestionTableView.isHidden { // 交给tableView处理事件 return suggestionTableView.hitTest(tableViewConvertPoint, with: event) } // 其余场景走默认事件传递逻辑 return super.hitTest(point, with: event) }
添加上述代码后,点击下拉列表的事件就会被正确传递给suggestionTableView,didSelectRowAt等代理方法就能正常触发。
内容的提问来源于stack exchange,提问作者helloworld12345
相关产品推荐
相关产品推荐

