NavigationController Push的VC中UISegmentedControl点击事件不触发求助
问题原因分析
你的UISegmentedControl点击事件无法触发,核心原因有两个:
视图层级覆盖:在
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都被遮挡。固定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
相关产品推荐
相关产品推荐

