【问题标题】:ReplayKit with SwiftUI使用 SwiftUI 的 ReplayKit
【发布时间】:2020-01-21 13:55:37
【问题描述】:

我想用 ReplayKit 录制屏幕。 我用 UIKit 研究了这个方法。但是我的项目使用的是 SwiftUI,所以我想使用 ReplayKit 来用 SwiftUI 录制屏幕。

如何用 SwiftUI 录屏?

-

当我使用stopRecording函数时,该函数会有previewViewController。但是我不能调用present函数来呈现previewViewController。

【问题讨论】:

标签: ios swift swiftui replaykit


【解决方案1】:

注意:这不是一个非常实用的答案。

在大多数情况下,“SwiftUI.View”运行在“UIHostingController”之上。 您需要抓住它来呈现“RPPreviewViewController”。 您可以通过“UIApplication”找到其中之一。

let scene = UIApplication.shared.connectedScenes.first as! UIWindowScene
let viewController = scene.windows.last!.rootViewController
viewController.present(previewViewController, animated: true, completion:nil)

【讨论】:

    【解决方案2】:

    我刚刚开源了一个使用 SwiftUI 的简单 ReplayKit 应用程序。

    https://github.com/snakajima/ReplayStartUpKit

    请看一下它是如何从 SwiftUI 呈现 RPBroadcastActivityViewController 的。

    它首先将指向控制器的指针存储在属性 bavController 中,然后设置 @Pubilshed 属性 activePopup 以启动 SwiftUI 更改。

    RPBroadcastActivityViewController.load { controller, error in
        if let controller = controller {
            self.bavController = controller
            controller.delegate = self
            self.activePopup = .broadCast
        }
    }
    

    在 SwiftUI (MainUIView.swift) 中,当属性 activePopup 变为 .broadCast 时,会激活以下视图。

    .sheet(item: $state.activePopup) { item in
        switch(item) {
        case .broadCast:
            BroadcastActivityController(controller: state.bavController!)
        }
    }
    

    BroadcastActivityController 有点长,因为它是针对 iPad 的解决方法,但它只是 RPBroadcastActivityController 的包装器。

    struct BroadcastActivityController: UIViewControllerRepresentable {
        let controller: RPBroadcastActivityViewController
        func makeUIViewController(context: Context) -> RPBroadcastActivityViewController {
            return controller
        }
        
        func updateUIViewController(_ uiViewController: RPBroadcastActivityViewController, context: Context) {
            // Hack to work around iPad issue
            if UIDevice.current.userInterfaceIdiom == .pad {
                guard let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate,
                      let vc = sceneDelegate.uiWindow?.rootViewController,
                      let view = vc.view else {
                    print("somethign is really wrong")
                    return
                }
                controller.modalPresentationStyle = .popover
                if let popover = controller.popoverPresentationController {
                    popover.sourceRect = CGRect(origin: .zero, size: CGSize(width: 10, height: 10))
                    popover.sourceView = view
                    popover.permittedArrowDirections = []
                }
            }
        }
        
        typealias UIViewControllerType = RPBroadcastActivityViewController
    }
    

    你需要做一些非常类似于 previewViewController 的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多