title: How to start ReplayKit screen recording in SpriteKit SKScene class
body: <p>I have implemented <code>ReplayKit</code> in my <code>SpriteKit</code> game, but since everything is done within the <code>GameViewController</code> the record button appears too early. Please see my <code>GameViewController</code> class below:</p>
  
  <pre><code>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.userInterfaceIdiom == .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
  }
  }
  </code></pre>
  
  <ol>
  <li><p>How can I call the <code>startRecording</code> and <code>stopRecording</code> functions from a class that inherits from <code>SKScene</code> like <code>GameScene</code> class?</p></li>
  <li><p>How can enable, disable and hide the <code>videoRecButton</code> button from the <code>GameScene</code> class?</p></li>
  </ol>
  
  <p><strong>UPDATE</strong></p>
  
  <p>Based on an answer from crashoverride777 a placed the following code in my <code>SKScene</code> class but the screen records for just a few seconds before the navigation controller with a preview of the recorded video appears. The recorded video is just a black screen and the cancel and save buttons are unresponsive.</p>
  
  <pre><code>    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", style: .plain, target: self, 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)
  }
  </code></pre>
  
  <p>I created a record button:</p>
  
  <pre><code>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&lt;UITouch&gt;, with event: UIEvent?) {
  
      for touch: AnyObject in touches {
          let location = touch.location(in: self)
          if videoRecButtonSprite.contains(location){
              startRecording()
          }
      }
  }
  </code></pre>