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

Swift 5 登录页背景视频加载后遮挡用户名密码文本框问题排查

问题原因

按照出现概率从高到低排序:

  • 核心原因:你通过addSublayer方法把AVPlayerLayer加到了videoLayer.layer的所有子层最顶部,后续的bringSubviewToFront操作只对父视图为videoLayer的控件生效。你描述里图片和登录按钮可以正常显示,说明这两个控件的父视图是videoLayer,而用户名、密码文本框大概率是加到了self.view或者其他非videoLayer的父视图上,所以调整层级的操作对两个文本框完全无效,等视频加载完成渲染后就被playerLayer完全盖住。
  • 次因:你在viewDidLoad阶段执行playVideo方法,此时视图的Auto Layout布局还未完全完成,后续布局更新时重置了视图层级,导致文本框的层级掉到了playerLayer下方。
  • 小概率原因:文本框的背景、文字颜色和视频背景色高度重合,你误以为被盖住,结合你提到的“加载过程闪现”可以基本排除该情况。

修复方案

  • 优先调整playerLayer的插入逻辑,从根源上避免层级冲突:把self.videoLayer.layer.addSublayer(playerLayer)替换为self.videoLayer.layer.insertSublayer(playerLayer, at: 0),直接将视频层插到所有子层的最底部,不需要额外调用bringSubviewToFront调整其他控件的层级。
  • 检查usernameTF和passwordTF的父视图,如果确实是加到了self.view上,需要调用self.view.bringSubviewToFront(usernameTF)、self.view.bringSubviewToFront(passwordTF)层级调整才会生效。
  • 如果是布局更新导致的层级错乱,可以把层级调整的逻辑放到viewDidLayoutSubviews生命周期方法中执行,确保布局完成后层级符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:09:04