読者です 読者をやめる 読者になる 読者になる

いものやま。

雑多な知識の寄せ集め

iOSでアプリからスクリーンショットを撮る方法について。

SoloXmasでは、結果の共有を出来るようにするために、TwitterFacebookに投稿できる機能を実装した。
このとき、当然画面の画像があった方がインパクトが強いので、画像も一緒に投稿したいところ。
ということで、アプリからスクリーンショットを撮る方法を調べてみた。

アプリからスクリーンショットを撮る

といっても、そんなに難しくなくて、

  1. グラフィックスコンテクストを作成し、現在のコンテクストにする
  2. ビューに対して、描画を指示(現在のコンテクストに描画される)
  3. 描画されたイメージを現在のコンテクストから取得
  4. グラフィックスコンテクストを破棄する

という感じ。

コードだと、以下の通り。

// GameScene.swift

class GameScene: TransitionableScene {
  // 省略

  private func getScreenShot() -> UIImage? {
    guard let view = self.view else {
      return nil
    }
    
    UIGraphicsBeginImageContext(view.frame.size)
    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return image
  }

  // 省略
}

ちなみに、グラフィックスコンテクストというのは「紙(とペン)」みたいなもので、「描画を行う対象(と方法)」を指す。
これが抽象化されていると、ビューはどのグラフィックスコンテクストに対しても同じように描画すればいいだけになって、ハードウェアに依存する部分を隠すことが出来、グラフィックスコンテクストを切り替えるだけで出力先を変更することが出来る。
例えば、グラフィックスコンテクストをPDFにすればPDFに描画の結果が出力されるし、プリンタにすればプリンタに、iPhoneの画面にすればiPhoneの画面に、描画の結果が出力されることになる。
そして、メモリ上に作られたグラフィックスコンテクストに描画を行えば、そこから画像のオブジェクトであるUIImageのインスタンスが取得できる、と。

広告はスクリーンショットに入る?

気になるところとしては、iAdの広告はスクリーンショットに入ってくるのかどうかということがある。

これについては、iAdを表示させる方法と画面サイズについて。 - いものやま。の方法で広告を表示させている場合、ゲーム内容が描画されているビューと広告が描画されているビューは別のビューとなっているので、スクリーンショットには広告は入ってこない。
なので、特に加工をしたりする必要もなく、そのまま使える。

今日はここまで!