LoginSignup
8
6

More than 5 years have passed since last update.

iOSで近接センサーをいじってみる

Posted at

iOSで近接センサーをいじってみる

iPhoneに搭載されている近接センサーを使って、手をかざしたことを検知したいと思って調べたことをまとめました。

対応機種について

近接センサーはiPhoneについているセンサーでiPad やiPod touchにはついていないようです。

とりあえず、使ってみる

UIDevice でproximitySensorを有効にします。
その後、NSNotificationCenterにObserverを追加します。

ViewController.swift
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        UIDevice.currentDevice().proximityMonitoringEnabled = true
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.proxitySensorStateChanged), name: UIDeviceProximityStateDidChangeNotification, object: nil)
    }

近接センサーが反応したとき、下記のメソッドが呼ばれるようにしました。
storyboard上のラベルの色が変化するだけです。

ViewController.swift
func proxitySensorStateChanged(){
        if (UIDevice.currentDevice().proximityState == true)
        {
            self.proximitySensor.backgroundColor = UIColor.greenColor()
        }
        else
        {
            self.proximitySensor.backgroundColor = UIColor.redColor()
        }
}

とりあえずこれだけで近接センサーは使えるようになりました。

IMG_0382.PNGIMG_0381.PNG
左が手をかざした時、右が手を離した時。

画面がブラックアウトする

手をかざしてから1秒ほどすると、画面がブラックアウトしました。
通話時の誤操作を避けるための機能みたいで、今のところ公開されてるAPIでどうにもできなさそう。
Stack Overflow : Keep display on when the proximity sensor is covered

ちなみに、試しに画面がブラックアウトしてる状態でNSTimerを使ってみたら動いていたので、画面が消えているだけみたい。

メソッドは値が変わった時しか呼ばれない

当たり前かもしれないですが、近接センサーはBool値で制御される(距離は計れない)ため通知センターからは値が変わった時しかメソッドが呼ばれません。
手をかざしている時間などを知りたい場合は、タイマーなどを併用する必要がありそうです。

まとめ

近接センサーの使い方がわかりました。
今後、アプリに活かしたいと思います。

8
6
0

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
8
6