iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的SpriteKit游戏中实现了replayKit,但由于一切都在GameViewController中完成,因此记录按钮显得过早.请参阅下面的GameViewController类:

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按钮?

updatE

根据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()
        }
    }
}

解决方法

你不应该在GameViewController中创建你的按钮,直接在你的SKScene中创建它.在SpriteKit游戏中使用GameViewController for UI并不是一个好习惯.

有很多关于如何在SpriteKit中创建按钮的教程.

关于replayKit,您可以直接在所需的SKScene中使用它,只需获取您已经拥有的代码并将其移动到相关场景.

要在SKScene中显示预览视图控制器,您可以这样说

view?.window?.rootViewController?.present(unwrappedPreview,animated: truE)

我还注意到,在您停止录制后,您正在呈现View控制器.你确定要这样做吗?通常,您在游戏菜单中有一个单独的按钮,您可以在其中观看录制内容.

这是一般代码.我还建议你查看苹果示例游戏DemoBots.

我个人使用Singleton类来管理录制,这样就更容易管理所有方法,因为你需要它来处理不同的场景.要启动类crate一个新的swift文件添加代码.

class ScreenRecoder: NSObject {

      /// Shared instance
      static let shared = ScreenRecorder()

      /// Preview controller
      var previewController: RPPreviewViewController?

      /// Private singleton init
      private override init() { }
 }

比开始录制将此方法添加到ScreenRecorder类.

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

这段代码非常直接来自DemoBots.

我认为处理屏幕录制的最好方法是在主菜单中创建一个自动录制按钮.使用UserDefaults保存它的开/关状态.如果打开它,则在游戏开始时调用startRecording,并在游戏结束时调用停止录制.比您在游戏菜单显示预览按钮,以便用户想要的情况下观看录制.

希望这可以帮助

大佬总结

以上是大佬教程为你收集整理的ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制全部内容,希望文章能够帮你解决ios – 如何在SpriteKit SKScene类中启动ReplayKit屏幕录制所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。