<!--more-->
示意代码(Swift):
// 安全窗口内:构建安全容器并挂到窗口上
private func setupSecureContainer() {
let textField = SecureOverlayTextField(frame: .zero) // 透明、isSecureTextEntry = true
guard let secureView = textField.subviews.first else { return }
secureView.removeFromSuperview()
secureView.subviews.forEach { $0.removeFromSuperview() }
secureView.frame = bounds
secureView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
secureView.isUserInteractionEnabled = true
super.addSubview(secureView) // 安全容器成为窗口唯一直接子视图
secureTextField = textField // 强引用保留,避免部分系统版本异常
secureContentView = secureView
}示意代码(Swift):
// 安全窗口:重写 addSubview,将内容重定向到安全容器
override func addSubview(_ view: UIView) {
if view === secureContentView {
super.addSubview(view)
} else if let content = secureContentView {
let isRootContent = content.subviews.isEmpty
if isRootContent {
view.frame = content.bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
content.addSubview(view) // 根内容与浮层都加在安全容器内
} else {
super.addSubview(view)
}
}frame = 安全容器.bounds 并设置自动调整大小,保证全屏且随窗口变化。subviews。这样无论是普通窗口还是安全窗口,都能正确找到浮层并执行移除、拖拽等逻辑。示意代码(Objective-C):
// 按 tag 查找加在「窗口」上的浮层时,兼容安全窗口
id window = [AppDelegate shared].window;
NSArray<UIView *> *subviewsToSearch = [window isKindOfClass:[SecureWindow class]]
? [(SecureWindow *)window subviewsForOverlayTagLookup]
: [window subviews];
UIView *overlay = nil;
for (UIView *view in subviewsToSearch) {
if (view.tag == kOverlayTag) {
overlay = view;
break;
}
}
if (overlay) {
// 执行移除、更新 frame、拖拽逻辑等
}示意代码(选择展示容器):
// 当 inView 为空时,决定 Toast/Loading 加在哪个视图上
func resolveToastContainerView() -> UIView? {
guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return nil }
if window is SecureWindow, let topVC = topViewController(for: window), let v = topVC.view {
return v // 安全窗口下用顶层 VC.view,避免加在安全容器内导致渲染异常
}
return window
}userInteractionEnabled 等。convertRect:fromView:)、访问 rootViewController 等与 addSubview 规则无关的用法,无需因防截屏而修改。UIScreenCapturedDidChangeNotification、UIScreen.isCaptured)做业务逻辑:例如提示用户、显示自定义遮挡层等,与「安全容器内不参与截屏」是互补关系。要点 | 说明 |
|---|---|
核心思路 | 用系统「安全输入」视图的私有子视图作为安全容器,重写窗口 addSubview 使所有内容进该容器,从而被截屏/录屏排除。 |
根内容 | 仅第一个加入安全容器的视图设全屏 frame;其余 overlay 保持原 frame。 |
查找浮层 | 安全窗口下必须用「overlay 查找接口」返回的列表(安全容器子视图),不能再用窗口的直接 subviews。 |
Toast/Loading | 可考虑以顶层 VC.view 等为展示容器,避免安全容器对后加子视图的渲染/尺寸问题。 |
不响应交互 | 先检查是否因「仍用窗口 subviews 查找」导致找不到视图;再排查 hitTest、手势与层级。 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。