UITabBarController中ContainerView加至keyWindow后点击按钮视图上跳问题
问题分析与解决方案
问题核心
你遇到的视图上跳问题,本质是将containerView从原ViewController视图层级移到keyWindow后,原有约束失效,加上系统按钮的默认交互逻辑触发了布局异常。
具体原因
- 约束失效:你只把
containerView添加到了keyWindow,但没有重新设置它在keyWindow上的约束。原有的约束是基于原ViewController的视图和tabBar的,当视图被移到keyWindow后,这些约束的参照对象不在同一层级,会被系统判定为无效,导致视图布局错乱,点击按钮时的布局重排会让视图跳到顶部。 - 系统按钮的默认行为:系统自带按钮默认开启了
adjustsImageWhenHighlighted等自动调整属性,点击时的状态变化会触发视图的位置调整;而自定义资源按钮没有这个问题,是因为这类按钮的默认属性不会触发该行为。另外,若不移到keyWindow,原视图层级的约束有效,布局稳定,所以不会出现上跳。
解决方案
1. 重新设置keyWindow上的约束
把原有的基于ViewController视图的约束,替换为基于keyWindow安全区域的约束,确保视图在新层级下布局稳定:
guard let window = UIApplication.shared.keyWindow else { return } containerView.translatesAutoresizingMaskIntoConstraints = false window.addSubview(containerView) // 根据你的原约束逻辑,设置对应window层级的约束 NSLayoutConstraint.activate([ containerView.leadingAnchor.constraint(equalTo: window.leadingAnchor), containerView.trailingAnchor.constraint(equalTo: window.trailingAnchor), containerView.bottomAnchor.constraint(equalTo: window.safeAreaLayoutGuide.bottomAnchor), containerView.heightAnchor.constraint(equalToConstant: 60) // 替换为你原containerView的高度 ])
2. 禁用系统按钮的自动调整行为
如果是系统按钮的默认状态调整导致的偏移,可以直接关闭相关属性:
// 在按钮初始化或配置时添加 if let button = sender as? UIButton { button.adjustsImageWhenHighlighted = false button.adjustsImageWhenDisabled = false }
3. 更安全的悬浮视图方案(推荐)
iOS 13+以后keyWindow的使用场景被弱化,更推荐通过UIWindowScene获取当前窗口,或者使用一个全局的容器VC来管理悬浮视图,避免直接操作window层级带来的布局风险。
内容的提问来源于stack exchange,提问作者PaulS
相关产品推荐
相关产品推荐

