ios 带有SwiftUI的回放套件

mefy6pfw  于 2022-12-30  发布在  iOS
关注(0)|答案(2)|浏览(139)

我想用ReplayKit录屏,我研究过UIKit的方法,但是我的项目用的是SwiftUI,所以我想用ReplayKit录SwiftUI的画面。
如何使用SwiftUI录制屏幕?

当我使用stopRecording函数时,该函数将具有previewViewController。但我无法调用present函数来显示previewViewController。

qxgroojn

qxgroojn1#

注意:这不是一个非常实际的答案。
在大多数情况下,“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)
iezvtpos

iezvtpos2#

我刚刚开源了一个简单的ReplayKit应用程序,它使用SwiftUI。
https://github.com/snakajima/ReplayStartUpKit
请看一下它是如何从SwiftUI中呈现RPBBroadcastActivityViewController的。
它首先将指向控制器的指针存储在属性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的工作区,但它只是RPBBroadcastActivityController的 Package 器。

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非常相似的操作。

相关问题