• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CoreMotionによる傾斜角測定)

CoreMotionによる傾斜角測定

このQ&Aのポイント
  • iOS8、Xcode6の初心者の方が、iPod touchの傾斜角を画面に表示させるために、CoreMotionを使用したプログラムを作成していますが、角度計測が行われずに初期画面の状態のままです。
  • プログラムはエラーは出ていないため、原因がわからず困っています。ご教示いただけると幸いです。
  • また、iOS8とXcode6の初心者なので、説明文を分かりやすくしていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

No.1です。 すみません。 No.1回答の最後のNSTimerに関するコメントを訂正します。 タイマーオブジェクトをインスタンス変数やプロパティに保持しなくても、 タイマー起動中は内部(NSRunLoop内)でオブジェクトがキープされているので 現状のコーディングのままでちゃんとタイマーは起動されるようです。 むしろ、repeats:YESにしている場合、どこかでタイマーオブジェクトに 対してinvalidateを実行しないと、タイマーオブジェクトが解放されず メモリリークになってしまうようです。 例えば新しいSubViewControllerを生成して、そのSubViewControllerで 今回のようなコードでタイマーを起動すると、SubViewControllerを dismissViewControllerで終了してもタイマーは停止せず、 SubViewControllerも解放されなくなってしまうようです。 結局、タイマーをinvalidateするためにタイマーオブジェクトを インスタンス変数やプロパティに覚えておかないといけないということになります。 今回の場合、メインのViewControllerでタイマーを起動しており、 アプリの起動中ずっとタイマーを起動したままにする設計なら、 このままでも大丈夫です。

ima_mitsu
質問者

お礼

この度は、回答頂き、ありがとうございます。 自分でしばらく試行錯誤の末、下記のようにしたところ、希望の動作をしております。 しかし、progressbar の部分で新たな問題が生じました。 それは、新たに質問をアップさせて頂きたいと思います。 今後とも、宜しくお願い致します。 ありがとうございました。 // ViewController.m #import "ViewController.h" #import <CoreMotion/CoreMotion.h> @interface ViewController () { // 変数の型定義 省略 //メンバ変数として宣言 @public AVAudioPlayer *audio; //モーションマネージャ CMMotionManager *motionManager; } //メソッド宣言 - (void)startAnimation; - (void)animation:(CMAccelerometerData *)data; @end @implementation ViewController - (void)viewDidLoad { [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(update) userInfo:nil repeats:YES]; [super viewDidLoad]; [self startAnimation]; jcount= -1; } // 入門ノートからコピー -(BOOL)shouldAutorotate { return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } // ビューが表示されたらアニメーションをスタートする - (void)viewDidAppear:(BOOL)animated { [self startAnimation]; } // アニメーションのスタート - (void)startAnimation { // モーションマネージャを作る motionManager = [[CMMotionManager alloc] init]; // 加速度センサーの計測インターバルの設定 motionManager.accelerometerUpdateInterval = 0.1;// 10Hz } - (void)animation:(CMAccelerometerData *)data { //jcount = -1; double xac = data.acceleration.x; // X 軸: 加速度G double yac = data.acceleration.y; // Y 軸: 加速度G angle = atan2(yac, xac) * - 180.0 / M_PI; 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 の値による、アラームの発生と傾斜角の表示 <省略> }

その他の回答 (1)

回答No.1

質問に書かれてあるコードをコピペして、 足りないところを適当に補って、エラーになるところを適当に削除して 実行してみたら、0.1秒毎にanimationメソッドが呼ばれて xac,yacに加速度センサの計測値がちゃんと入っていました。 なので、ちゃんと計測はできているけど、意図した表示ができてないんじゃないでしょうか? とりあえず、animationメソッド内でxac,yacを取得する箇所でところでNSLogで値を表示してみたら 計測できているかどうかはっきりすると思います。 表示の仕方がおかしいかどうか(というか、どんな表示を期待しているか)は、 このコードからはわかりませんでした。 animationメソッド内はxac,yacを更新するだけで、じゃあxac,yacの値を 使って、いつ表示を更新するつもりなのかこのコードからは見えませんでした。 NSTimerで0.1秒ごとにupdateメソッドを呼び出そうとしている処理があるので updateメソッド内で表示を更新しているのかなと想像しましたが、 そのupdateメソッドの処理が開示されてないのでわかりませんでした。 (updateメソッドがないのでNSTimerの処理は削除して検証しました。) ちなみにNSTimerでタイマー起動している処理は、その戻り値でもらった タイマーオブジェクトをインスタンス変数かプロパティに保持していないと、 すぐにオブジェクト解放され、タイマー呼び出しはされないと思いますよ。 もしかしたら、問題はそこかもしれませんね。

関連するQ&A