15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ホームボタン押下時に処理を止める

Last updated at Posted at 2016-09-12

##はじめに
ホームボタンを押した時に処理を止めたいとか、ポーズメニューを表示したい場合があります。
音楽を使ったゲームや連続性のあるゲームでよくあるのではないでしょうか。

##ホームボタン押下時に呼ばれるメソッド
まずホームボタンを押した時(厳密にはアプリを閉じそうな時)に呼ばれるメソッドはAppDelegate.swift内の
applicationWillResignActiveメソッドです。
ちなみに、ホームボタンを2回連続で押した時(メモリ解放の画面になるやつです)や、電話が掛かってきた時もこちらのメソッドが呼ばれます。

AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    //アプリを閉じそうな時に呼ばれる
    func applicationWillResignActive(application: UIApplication) {
        //ポーズの処理を行う
    }
}

その中にコードを書けば良いのですが、すでに別のクラスでポーズメニューの処理を書いていたりしたので、NSNotificationCenterクラスを使ってみました。これが結構便利です

NSNotificationCenterクラスは通知という仕組みを使って、あるイベントが発生した時に別クラスでそのイベントを拾うことができます。

##通知の追加
例えばPauseGameSceneという名前の通知をapplicationWillResignActiveメソッド内に作ります。
NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)

AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func applicationWillResignActive(application: UIApplication) {
       NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)
    }
}

##オブザーバーの追加
次は別のクラスで通知を受け取る役割を担うオブザーバーというものを追加します。例ではGameViewControllerクラスを使っています。

GameViewController.swift

import SpriteKit

class GameViewController: UIViewController{
    
    var gameScene: GameScene!

    override func viewDidLoad() {
        //...省略
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pause), name: "PauseGameScene", object: nil)
    }

    func pause() {
        //ここでポーズの処理やポーズメニューを表示
        //例えばこんな感じの処理
        self.gameScene.view!.paused = true
    }

    deinit{
        //削除
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

addObserverのselectorには実行したいメソッド名(ここではpause)、nameには作っておいた通知の名前(ここではPauseGameScene)を入れます。

後は指定したメソッド内で、ポーズの処理を書くだけです。

最後にdeinit内でオブザーバーを削除した方がいいのかな?

15
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?