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

NavigationController Push的VC中UISegmentedControl点击事件不触发求助

问题原因分析

你的UISegmentedControl点击事件无法触发,核心原因有两个:

  1. 视图层级覆盖:在viewDidLoad中你先调用setUpViews添加segmentedControl,随后调用setUpSegmentedControl添加两个子VC的view。由于addSubview的顺序,子VC的view会被放在segmentedControl的上层。虽然你设置子VC的view从y=90开始,但segmentedControl默认高度为44,加上top约束的60偏移,它的底部位置是60+44=104,这意味着子VC的view会覆盖segmentedControl的下半部分(y=90到104),点击这部分时事件会被子VC的view拦截。如果布局计算存在偏差,甚至可能整个segmentedControl都被遮挡。

  2. 固定frame的适配问题:用固定y=90设置子VC的view位置,没有考虑segmentedControl的实际高度或不同屏幕的适配情况,容易导致覆盖问题。

解决方案

方案一:调整视图层级,确保segmentedControl在最上层

在添加完子VC的view后,将segmentedControl移到视图层级的最前面:

func setUpSegmentedControl(){
    addChild(VC1)
    addChild(VC2)

    self.view.addSubview(VC1.view)
    self.view.addSubview(VC2.view)

    VC1.didMove(toParent:self )
    VC2.didMove(toParent:self )

    VC1.view.frame = CGRect(x: 0, y: 90, width: view.bounds.width, height: view.bounds.height)
    VC2.view.frame = CGRect(x: 0, y: 90, width: view.bounds.width, height: view.bounds.height)

    VC2.view.isHidden = true
    
    // 确保segmentedControl在最上层,不会被遮挡
    view.bringSubviewToFront(segmentedControl)
}

方案二:用AutoLayout替代固定frame,避免覆盖

放弃固定y=90的写法,让子VC的view自动贴合segmentedControl的底部,同时统一使用AutoLayout布局:

func setUpSegmentedControl(){
    addChild(VC1)
    addChild(VC2)

    // 关闭子VC view的自动转换约束
    VC1.view.translatesAutoresizingMaskIntoConstraints = false
    VC2.view.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(VC1.view)
    self.view.addSubview(VC2.view)

    VC1.didMove(toParent:self )
    VC2.didMove(toParent:self )

    // 用AutoLayout约束子VC的view,确保在segmentedControl下方
    NSLayoutConstraint.activate([
        VC1.view.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor),
        VC1.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        VC1.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        VC1.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        
        VC2.view.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor),
        VC2.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        VC2.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        VC2.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    ])

    VC2.view.isHidden = true
}

额外优化:修复segmentedControl的top约束

当前你将segmentedControl的top约束绑定到view.topAnchor,在NavigationController中这会导致segmentedControl部分被导航栏遮挡。建议改为绑定到安全区域:

// 替换setUpViews中的对应约束
segmentedControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 2),

内容的提问来源于stack exchange,提问作者MilkBottle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:10:31