大佬教程收集整理的这篇文章主要介绍了ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class GameViewController: UIViewController,RPPreviewViewControllerDelegate { var videoRecButton: UIButton! var videoRecImage: UIImage! override func viewDidLoad() { super.viewDidLoad() let skView = self.view as? SKView if skView?.scene == nil { skView?.showsFPS = true skView?.showsnodeCount = true skView?.showsPhysics = true skView?.ignoresSiblingOrder = false //starTing the game with the Poster Scene let posterScene = PosterScene(size: skView!.bounds.sizE) posterScene.scaleMode = .aspectFill skView?.presentScene(posterScenE) } videoRecButton = UIButton(type: .custom) videoRecImage = UIImage(named:"videoRecButton.png") videoRecButton.frame = CGRect(x:0,y: 0,width: (videoRecImage?.size.width)!,height: (videoRecImage?.size.height)!) videoRecButton.setImage(videoRecImage,for: .normal) videoRecButton.addTarget(self,action:#SELEctor(self.videoRecButtonClicked),for: .touchUpInsidE) self.view.addSubview(videoRecButton) } func videoRecButtonClicked() { print("Button Clicked") startRecording() } func startRecording() { let recorder = RPScreenRecorder.shared() recorder.startRecording{ [uNowned self] (error) in if let unwrappedError = error { print(unwrappedError.localizedDescription) } else { self.videoRecButton.addTarget(self,action:#SELEctor(self.stopRecording),for: .touchUpInsidE) } } } func stopRecording() { let recorder = RPScreenRecorder.shared() recorder.stopRecording { [uNowned self] (preview,error) in self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Start",style: .plain,target: self,action: #SELEctor(self.startRecording)) if let unwrappedPreview = preview { unwrappedPreview.previewControllerDelegate = self self.present(unwrappedPreview,animated: truE) } } } func previewControllerDidFinish(_ previewController: RPPreviewViewController) { dismiss(animated: truE) } override var shouldAutorotate: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { if UIDevice.current.userInterfaceI@L_766_2@m == .phone { return .allButUpsideDown } else { return .all } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data,images,etc that aren't in use. } override var prefeRSStatusBarHidden: Bool { return true } }
>如何从继承自SKScene的类(如GameScene类)调用startRecording和stopRecording函数?
>如何从GameScene类启用,禁用和隐藏videoRecButton按钮?
根据crashoverride777的答案,我在SKScene类中放置了以下代码,但屏幕记录了导航控制器之前几秒钟,并显示录制视频的预览.录制的视频只是一个黑屏,取消和保存按钮没有响应.
func startRecording() { let recorder = RPScreenRecorder.shared() if #available(iOS 10.0,*) { recorder.startRecording{ [uNowned self] (error) in if let unwrappedError = error { print(unwrappedError.localizedDescription) } else { self.stopRecording() } } } else { // fallBACk on earlier versions } } func stopRecording() { let recorder = RPScreenRecorder.shared() recorder.stopRecording { [uNowned self] (preview,error) in self.view?.window?.rootViewController?.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Start",action: #SELEctor(self.startRecording)) if let unwrappedPreview = preview { unwrappedPreview.previewControllerDelegate = self self.view?.window?.rootViewController?.present(unwrappedPreview,animated: truE) } } } func previewControllerDidFinish(_ previewController: RPPreviewViewController) { view?.window?.rootViewController?.dismiss(animated: truE) }
我创建了一个记录按钮:
let videoRecButtonSprite = SKSpriteNode(imagenamed: "videoButton") videoRecButtonSprite.position = CGPoint(x: self.frame.width/15,y: self.frame.height - self.frame.height/12) self.addChild(videoRecButtonSpritE) override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) { for touch: AnyObject in touches { let LOCATIOn = touch.LOCATIOn(in: self) if videoRecButtonSprite.contains(LOCATIOn){ startRecording() } } }
有很多关于如何在SpriteKit中创建按钮的教程.
关于replayKit,您可以直接在所需的SKScene中使用它,只需获取您已经拥有的代码并将其移动到相关场景.
要在SKScene中显示预览视图控制器,您可以这样说
view?.window?.rootViewController?.present(unwrappedPreview,animated: truE)
我还注意到,在您停止录制后,您正在呈现View控制器.你确定要这样做吗?通常,您在游戏菜单中有一个单独的按钮,您可以在其中观看录制内容.
我个人使用Singleton类来管理录制,这样就更容易管理所有方法,因为你需要它来处理不同的场景.要启动类crate一个新的swift文件并添加此代码.
class ScreenRecoder: NSObject { /// Shared instance static let shared = ScreenRecorder() /// Preview controller var previewController: RPPreviewViewController? /// Private singleton init private override init() { } }
func start() { let sharedRecorder = RPScreenRecorder.shared() // Do nothing if screen recording is not available guard sharedRecorder.isAvailable else { return } // Stop prevIoUs recording if necessary if sharedRecorder.isRecording { stopScreenRecording() } print("StarTing screen recording") // Register as the recorder's delegate to handle errors. sharedRecorder.delegate = self // Start recording if #available(iOS 10.0,*) { #if os(iOS) sharedRecorder.isMicrophoneEnabled = true //sharedRecorder.isCameraEnabled = true // fixme #endif sharedRecorder.startRecording { [uNowned self] error in if let error = error as? NSError,error.code != RPRecordingErrorCode.userDeclined.rawValue { print(error.localizedDescription) // Show alert return } } } else { // fallBACk on earlier versions sharedRecorder.startRecording(withMicrophoneEnabled: truE) { error in if let error = error as? NSError,error.code != RPRecordingErrorCode.userDeclined.rawValue { print(error.localizedDescription) // Show alert return } } } }
要停止录音,请拨打此电话您注意到我实际上还没有显示预览,我只是将其存储以供以后使用.这是你通常的做法.
func stop() { let sharedRecorder = RPScreenRecorder.shared() // Do nothing if screen recording is not available guard sharedRecorder.isAvailable else { return } // Stop recording sharedRecorder.stopRecording { [uNowned self] (previewViewController,error) in if let error = error { // If an error has occurred,display an alert to the user. print(error.localizedDescription) // Show alert return } print("Stop screen recording") if let previewViewController = previewViewController { // Set delegate to handle view controller dismissal. previewViewController.previewControllerDelegate = self /* Keep a reference to the `previewViewController` to present when the user presses on preview button. */ self.previewViewController = previewViewController } } }
在ScreenRecorder类中创建符合replayKit委托的2个扩展.
预览控制器代表
/// RPPreviewViewControllerDelegate extension ScreenRecorder: RPPreviewViewControllerDelegate { /// Preview controller did finish func previewControllerDidFinish(_ previewController: RPPreviewViewController) { previewController.dismiss(animated: true,completion: nil) } }
和录音代表
extension ScreenRecorder: RPScreenRecorderDelegate { /// Screen recoder did stop with error func screenRecorder(_ screenRecorder: RPScreenRecorder,didStopRecordingWithError error: Error,previewViewController: RPPreviewViewController?) { // Display the error the user to alert them that the recording Failed. let error = error as NSError if error.code != RPRecordingErrorCode.userDeclined.rawValue { print(message: error.localizedDescription) // show alert } // Hold onto a reference of the `previewViewController` if not nil. if let previewViewController = previewViewController { self.previewViewController = previewViewController } } /// Screen recoder did change availability func screenRecorderDidChangeAvailability(_ screenRecorder: RPScreenRecorder) { // e.g update your button UI etc // you can use something like delegation to pass something to your SKScenes } }
最后创建一个方法来呈现预览.最好通过游戏菜单中的按钮来调用此功能.
func showPreview() { guard let previewViewController = previewViewController else { return } print("Showing screen recording preview") // `RPPreviewViewController` only supports full screen modal presentation. previewViewController.modalPresentationStyle = .fullScreen let rootViewController = UIApplication.shared.keyWindow?.rootViewController rootViewController?.present(previewViewController,animated: true,completion:nil) }
ScreenRecorder.shared.start() ScreenRecorder.shared.stop() ScreenRecorder.shared.showPreview() // call stop before calling this
我认为处理屏幕录制的最好方法是在主菜单中创建一个自动录制按钮.使用UserDefaults保存它的开/关状态.如果打开它,则在游戏开始时调用startRecording,并在游戏结束时调用停止录制.比您在游戏菜单中显示预览按钮,以便在用户想要的情况下观看录制.
希望这可以帮助
以上是大佬教程为你收集整理的ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制全部内容,希望文章能够帮你解决ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。