为什么导航栏titleView中自定义视图里的UIButton无法响应点击事件?
问题原因与修复方案
- 首先修正
titleView的赋值对象,不要通过导航控制器取topItem赋值,直接给当前控制器的navigationItem赋值即可,避免取到错误的导航项:
把原代码中
替换为navigationController?.navigationBar.topItem?.titleView = titleViewself.navigationItem.titleView = titleView - 为自定义
TitleView明确设置尺寸。从XIB加载的自定义视图如果没有显式设置宽高,系统会默认计算它的尺寸为0,即使子视图能正常显示,超出父视图bounds的区域也无法响应触摸事件。可以在加载后手动设置frame:
也可以直接在XIB中给// 宽度可根据实际需求调整,高度匹配导航栏默认高度即可 titleView?.frame = CGRect(x: 0, y: 0, width: 200, height: 44)TitleView的根视图添加宽高约束,让系统自动计算它的固有尺寸。 - 检查自定义
TitleView根视图的isUserInteractionEnabled属性,确保XIB中该属性没有被关闭,值为true。 - 如果以上步骤都无效,可以在
TitleView类中重写hitTest方法,强制将对应区域的触摸事件传递给按钮:override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { // 这里的title对应你绑定的按钮属性 if self.title.point(inside: convert(point, to: self.title), with: event) { return self.title } return super.hitTest(point, with: event) }
内容的提问来源于stack exchange,提问作者Ginso
相关产品推荐
相关产品推荐

