CoreMotionによる傾斜角測定
ios8, xcode6 の初心者です。
iPodtouch の傾斜角を画面に表示させるのに以前は、 UIAccelerometerを使用していたところ、バージョンがアップされたのに伴い、 CoreMotion を使うようにとのメッセージに従い、テキスト本の作例を参考に下記のようなプログラムを書いたところ、エラーはでないのですが、初期画面の状態のままで、角度計測を行いません。 ご教示頂けましたら、幸いです。
宜しくお願い致します。
// ViewController.m
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
// 変数の型定義と初期値の設定 <省略>
double xac;
double yac;
@interface ViewController ()
{
//メンバ変数として宣言
@public AVAudioPlayer *audio;
//モーションマネージャ
CMMotionManager *motionManager;
//水平、垂直方向の速度
double speedx;
double speedy;
//ビューの縦横、ボールの半径、跳ね返り係数
double viewWidth;
double viewHeight;
double ballR;
double haneK;
}
//メソッド宣言
- (void)setupAccelerometer;
- (void)startAnimation;
- (void)animation:(CMAccelerometerData *)data;
@end
@implementation ViewController
- (void)viewDidLoad
{
// extern angle;
[NSTimer
scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(update)
userInfo:nil
repeats:YES];
[super viewDidLoad];
[self setupAccelerometer];
}
- (void)setupAccelerometer{
[self startAnimation];
angle = atan2(yac, xac) * - 180.0 / M_PI;
// v = angle;
NSString *path =[[NSBundle mainBundle] pathForResource:@"nothing" ofType:@"wav"];
jcount =jcount +1;
angle_ar [jcount] = angle;
self.jcount_Label.text = [NSString stringWithFormat:@"%d", jcount];
if (angle > angle_R) { angle_R = angle ;}
if (angle < angle_L) { angle_L = angle ;}
self.R_Label.text = [NSString stringWithFormat:@"Rmax= %d", angle_R];
self.Incl_Label.text = [NSString stringWithFormat:@"%d", angle];
self.black.transform = CGAffineTransformMakeRotation(M_PI * angle / 180);
self.L_Label.text = [NSString stringWithFormat:@"Lmax= %d", angle_L];
// angle の値による、アラームの発生 <省略>
}
// 入門ノートから、以下コピー
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(BOOL)shouldAutorotate {
return YES;
}
// ビューが表示されたらアニメーションをスタートする
- (void)viewDidAppear:(BOOL)animated
{
[self startAnimation];
}
// アニメーションのスタート
- (void)startAnimation {
//速度の初期化
speedx = 0;
speedy = 0;
// 画面の縦横サイズ
viewWidth = self.view.bounds.size.width;
viewHeight = self.view.bounds.size.height;
// ballR = _ball.bounds.size.height/2;
//跳ね返り係数
haneK = 0.6;
// モーションマネージャを作る
motionManager = [[CMMotionManager alloc] init];
// 加速度センサーの計測インターバルの設定
motionManager.accelerometerUpdateInterval = 0.1;// 10Hz
// 定期的に実行するハンドラを設定
CMAccelerometerHandler handler = ^(CMAccelerometerData *data, NSError *error){
[self animation:data];
};
// 加速度センサーの利用を開始
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:handler];
}
// 定期的に呼ばれてアニメーションを実行する
- (void)animation:(CMAccelerometerData *)data
{
// double time = data.timestamp;// 経過時間
xac = data.acceleration.x;// X 軸: 加速度G
yac = data.acceleration.y;// Y 軸: 加速度G
// double accz = data.acceleration.z;// Z 軸: 加速度G
}
@end
お礼
ありがとうございます。