我刚刚开源了一个使用 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 的事情。