You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么导航栏titleView中自定义视图里的UIButton无法响应点击事件?

问题原因与修复方案

  • 首先修正titleView的赋值对象,不要通过导航控制器取topItem赋值,直接给当前控制器的navigationItem赋值即可,避免取到错误的导航项:
    把原代码中
    navigationController?.navigationBar.topItem?.titleView = titleView
    
    替换为
    self.navigationItem.titleView = titleView
    
  • 为自定义TitleView明确设置尺寸。从XIB加载的自定义视图如果没有显式设置宽高,系统会默认计算它的尺寸为0,即使子视图能正常显示,超出父视图bounds的区域也无法响应触摸事件。可以在加载后手动设置frame:
    // 宽度可根据实际需求调整,高度匹配导航栏默认高度即可
    titleView?.frame = CGRect(x: 0, y: 0, width: 200, height: 44)
    
    也可以直接在XIB中给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:36:04