一般的には傾きセンサーと呼ばれる事もありますが、公式では加速度センサーと言います。
この加速度センサーを利用して本体を振った事を検知してみます。
プロジェクトは「Window-Based Application」で作成しています。
お試しで何かやる時はお手軽かなぁと勝手に思ってる。
とりあえず「ShakeTest」と入力して作成。
プロジェクトが作成されたら新規ファイルの追加で「UIViewController subClass」でファイルを追加する。
「MyViewController」と入力して作成。
ShakeTestAppDelegate.hに以下の赤文字の部分を追記します。
#import <UIKit/UIKit.h>
@interface ShakeTestAppDelegate : NSObject { IBOutlet UIWindow *window; IBOutlet UIViewController *m_view_controller; }
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end |
MyViewController.hに以下の赤文字の部分を追記。
加速度センサーを使うためのプロトコルとラベルの表示を戻すボタンとラベルの宣言です。
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController <UIAccelerometerDelegate> { IBOutlet UIButton *btn_Reset; IBOutlet UILabel *lbl_Shake; }
- (IBAction) btn_Reset_DOWN:(id) sender;
@end |
ここまで出来たら一旦ビルドなどしてファイルを保存します。
次にInterfaceBuilderでNIBファイルを開きます。
開いたらUIViewControllerを追加。
そのUIViewControllerにViewを追加し、さらにそのViewにボタンとラベルを追加します。

上のメニューのToolsからMyViewControllerのInspectorを開きます。
開いたら右端のタブを選択し、Classの所をMyViewControllerに変更します。

次に、宣言したIBOutletとIBActionをInterfaveBuilderで接続します。
MainWindowにあるShakeTestAppDelegateの行で右クリックすると以下のメニューが出ます。

さっきShakeTestAppDelegate.hに追加したm_view_controllerがあります。
右の方にある○をMyViewControllerのウィンドウにドラッグします。
そうするとヘッダに宣言したm_view_controllerと接続されます。

同様にMyViewControllerで宣言したボタンとラベルのIBOutletとボタンのIBActionも繋ぎます。

アクションはボタンへドラッグするとどのアクションに接続するかのメニューが表示されます。
Touch Up Insideで良いと思います。

接続が終わったら保存します。
Xcodeに戻ります。
「ShakeTestAppDelegate.m」に以下の赤文字の部分を追記します。
ビューをウィンドウに足す事と、ビューのリリースです。
#import "ShakeTestAppDelegate.h"
@implementation ShakeTestAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after application launch [window addSubview:m_view_controller.view]; [window makeKeyAndVisible]; }
- (void)dealloc { [m_view_controller release]; [window release]; [super dealloc]; }
@end |
MyViewController.mに以下を記述します。
加速度センサーを有効にする事と加速度センサーの状態を受け取るメソッドの記述。
それと振った事を検知する処理です。
- (void)viewDidLoad { [super viewDidLoad];
// 加速度センサーを有効にする [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 15)]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; }
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { const float violence = 1.5; static BOOL beenhere; BOOL shake = FALSE;
if (beenhere) return;
beenhere = TRUE;
if (acceleration.x > violence || acceleration.x < -1*violence) shake = TRUE; if (acceleration.y > violence || acceleration.y < -1*violence) shake = TRUE; if (acceleration.z > violence || acceleration.z < -1*violence) shake = TRUE;
if (shake) { // 振った時の処理 [lbl_Shake setText:@"振ったな!"]; } beenhere = FALSE; }
- (IBAction) btn_Reset_DOWN:(id) sender { // ラベルの表示を元に戻す [lbl_Shake setText:@"振ってみて〜"]; }
@end |
これでiPhoneを振った時の処理をする事が出来ます。
振り幅などの値を色々いじって反応を見てみると面白いと思います。