Mac Catalyst应用中安全UITextField下方出现异常透明视图求助
Mac Catalyst下UITextField安全输入框清空后出现异常透明视图的解决方法
问题背景
基于UIKit+Swift开发的iOS应用转Mac Catalyst时,遇到专属异常:设置isSecureTextEntry = true的UITextField,在输入字符后删除全部内容,输入框下方会出现一个无法通过点击应用内区域关闭的透明视图,仅切换应用或按ESC键可消除。iOS端无此问题,且无法通过Debug View Hierarchy捕获该视图(后台后自动消失)。尝试修改textContentType、keyboardType均无效,推测是系统密码相关功能的异常渲染导致。
可行解决方案
方案1:自定义安全输入框子类,拦截清空操作
创建SecureTextField子类,重写退格方法,在文本即将清空时主动取消并恢复第一响应,规避系统异常逻辑:
class SecureTextField: UITextField { override func deleteBackward() { if text?.isEmpty ?? true { resignFirstResponder() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.becomeFirstResponder() } } super.deleteBackward() } }
将原项目中的安全输入框替换为此子类,保持isSecureTextEntry = true的设置即可。
方案2:监听文本变化,重置输入框状态
给安全输入框添加文本变化监听,当文本清空时强制刷新布局并重置安全输入状态:
// 在视图控制器的viewDidLoad或输入框初始化时添加监听 override func viewDidLoad() { super.viewDidLoad() secureTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) } @objc private func textFieldDidChange(_ textField: UITextField) { guard textField.isSecureTextEntry, textField.text?.isEmpty ?? false else { return } // 强制刷新布局 textField.setNeedsLayout() textField.layoutIfNeeded() // 临时切换安全输入状态重置系统逻辑 textField.isSecureTextEntry = false textField.isSecureTextEntry = true }
方案3:遍历窗口视图移除异常元素
由于无法通过Debug View Hierarchy定位,可在文本清空时遍历应用窗口的子视图,根据特征移除透明异常视图(需根据实际视图位置、透明度调整判断条件):
@objc private func textFieldDidChange(_ textField: UITextField) { guard textField.isSecureTextEntry, textField.text?.isEmpty ?? false else { return } // 延迟执行,确保异常视图已渲染 DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { UIApplication.shared.windows.forEach { window in window.subviews.forEach { subview in // 示例判断:透明且位置在输入框下方 if subview.alpha < 1.0 && subview.frame.minY > textField.frame.maxY { subview.removeFromSuperview() } } } } }
内容的提问来源于stack exchange,提问作者uem
相关产品推荐
相关产品推荐

