You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动