iOS 13+下ReplayKit录屏排除UI元素及独立窗口创建方法问询
在iOS 13+中使用ReplayKit录屏时排除指定UI元素的解决方案
嘿,刚好踩过这个坑!在iOS 13及以后的系统里,把不想被录制的UI元素放到独立窗口确实是可行的方案,你之前没成功大概率是窗口的配置细节没到位。下面我一步步给你讲清楚怎么做:
一、创建并配置独立窗口(关键步骤)
iOS 13+引入了多场景架构,所以创建窗口时必须关联对应的UIWindowScene,这是很多人忽略的点。具体操作如下:
- 先获取当前的窗口场景,一般可以从现有视图的窗口中获取
- 设置窗口的层级为高于主窗口的级别(比如
.alert),ReplayKit默认只会录制windowLevel为.normal的窗口,更高层级的窗口会自动被排除 - 把要隐藏的UI元素添加到这个窗口的根视图控制器中,同时可以设置窗口背景透明,避免遮挡主界面内容
- 最后记得显示窗口(设置
isHidden = false)
给你一段可直接复用的Swift代码示例:
// 从当前ViewController的窗口获取场景 guard let currentWindowScene = view.window?.windowScene else { print("无法获取当前窗口场景") return } // 创建独立窗口 let excludedElementWindow = UIWindow(windowScene: currentWindowScene) // 设置窗口层级,高于主窗口的.normal excludedElementWindow.windowLevel = .alert // 设置背景透明,不遮挡主界面 excludedElementWindow.backgroundColor = .clear // 创建你不想被录制的UI元素,比如一个悬浮按钮 let nonRecordedButton = UIButton(type: .system) nonRecordedButton.setTitle("不被录制的按钮", for: .normal) nonRecordedButton.frame = CGRect(x: 40, y: 120, width: 220, height: 60) nonRecordedButton.backgroundColor = .white // 创建根视图控制器并添加元素 let rootVC = UIViewController() rootVC.view.addSubview(nonRecordedButton) excludedElementWindow.rootViewController = rootVC // 显示窗口 excludedElementWindow.isHidden = false
二、手动强制排除窗口(可选)
如果遇到层级设置后还是被录制的情况,你可以直接调用ReplayKit的API手动指定排除某个窗口,这个方法在iOS 11+就支持,iOS 13+依然可用:
// 强制排除我们创建的独立窗口 RPScreenRecorder.shared().setExcludesWindow(excludedElementWindow, excluded: true) // 也可以检查某个窗口是否被排除 let isExcluded = RPScreenRecorder.shared().isWindowExcludedFromRecording(excludedElementWindow) print("窗口是否被排除:\(isExcluded)")
三、常见踩坑点提醒
- 忘记关联WindowScene:iOS 13+创建窗口必须传入
windowScene,否则窗口根本不会显示,这是最常见的失败原因 - 窗口层级设置错误:如果层级和主窗口一样是
.normal,那还是会被录制进去,一定要设置更高的层级(比如.alert、.statusBar或者自定义数值) - 窗口未正确显示:务必确保
isHidden设为false,如果需要窗口成为交互窗口,可以调用makeKeyAndVisible(),但如果只是显示非交互元素,isHidden = false就足够
这种方法适用于悬浮按钮、隐私弹窗、版权水印等任何你不想被录屏捕获的UI元素,亲测在iOS13到iOS17都能正常工作。
内容的提问来源于stack exchange,提问作者Nevgauker




