2012年1月27日金曜日

加速度から角度を求める

//加速度取得間隔の設定[sec]
    self.motionManager.accelerometerUpdateInterval = 0.01;
// デバイスモーションの取得開始

    NSOperationQueue *queueAccl = [[[NSOperationQueue alloc] init] autorelease];
    [self.motionManager startAccelerometerUpdatesToQueue:queueAccl
                                             withHandler:^(CMAccelerometerData *data, NSError *error) {
                                                 dispatch_async(dispatch_get_main_queue(), ^{
                                                     x=data.acceleration.x;
                                                     y=data.acceleration.y;

                                                     radian=atan2(x,y)*(180 / M_PI);//角度の計算
                                                     
                                                     NSLog(@"%f",radian);


                                                 });
                                             }];

2012年1月24日火曜日

リソース

ObjectiveC開発で読んだアップルのPDFドキュメントリストです。
随時更新していきます
CoreMotionのCMLogItemクラスについてのドキュメント
http://developer.apple.com/library/ios/DOCUMENTATION/CoreMotion/Reference/CMLogItem_Class/CMLogItem_Class.pdf
ブロック書式についてのドキュメント
http://developer.apple.com/jp/devcenter/ios/library/documentation/Blocks.pdf

ブロックについて(追記)


ブロック変数を宣言し、ブロックリテラルの始まりを表すには、^演算子を使用します。ブロックの本体は、したの例のように、{}で囲まれます

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
ブロックでは、ブロックが定義されているスコープ(有効範囲)に含まれている変数を利用できま す。 ブロックを変数として宣言した場合には、ブロックを関数と同じように使用できます。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
printf("%d", myBlock(3));
// "21"と出力する


ブロックの概念
アップルのドキュメントにはブロックについて下記のように定義されています


ブロックは、以下のような特徴を持つ無名のインラインコードの集合体です。
● 関数と同様に、型付きの引数リストを持つ
● 推定または宣言された戻り値型を持つ
● ブロックの定義を含むレキシカルスコープの状態を把握できる
● 必要であれば、レキシカルスコープの状態を変更できる
● 変更できるかどうかは、同じレキシカルスコープ内で定義されているほかのブロックと共通である
● レキシカルスコープ(スタックフレーム)が破棄された後も、引き続きそのレキシカルスコープ内で定義されている状態を共有したり変更したりできる
ブロックをコピーしたり、遅延実行のために、ブロックをほかのスレッドに渡すこともできます(または、ブロック自身のスレッド内で、実行ループに渡すことができます)。コンパイラとランタイムは、ブロックのすべてのコピーが存続している間は、そのブロックから参照されるすべての変数を保持するように調整します。ブロックは純粋なCおよびC++で利用できますが、ブロックは常にObjective-Cのオブジェクトでもあります


ブロックの使い方


通常、ブロックは自己完結的な小さなコード部品です。このため、ブロックは、並列に実行されたり、1つのコレクション内の複数のアイテムを対象に実行される一連の作業をカプセル化する手段として、また、別の操作が終了したときのコールバックとして、特に有用です。
ブロックは、主に次の2つの理由から、従来のコールバック関数に代わる有用な手段になります。
1. ブロックを利用すると、メソッド実装のコンテキストで後から実行されるコードを、呼び出しの時点で記述できます。したがって、通常、ブロックはフレームワークメソッドのパラメータになります。

2. ブロックでは、ローカル変数にアクセスできます。
操作の実行に必要なすべてのコンテキスト情報を具体化したデータ構造を要求するコールバックを使用する代わりに、単純にローカル変数に直接アクセスできます。

変数について
ブロック内で使える変数は
クラス変数、ブロックで定義されている関数の変数、__blockストレージ型で定義された変数の3つです。
ブロック内に新しい変数を定義してもエラーが出ます。

__blockストレージ型の使い方例
__block int x = 123; //  xはブロック外
void (^printXAndY)(int) = ^(int y) { //yしか変数が定義されていない
x = x + y;
printf("%d %d\n", x, y);
};
printXAndY(456); // "579,456"と出力する
// xは現在579

CoreMotionで加速度取得

CMMotionManager *manager = [[CMMotionManager alloc] init];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// サンプリングレート 100Hz
manager.accelerometerUpdateInterval = 1.0/100;
// 加速度取得開始
[manager startAccelerometerUpdatesToQueue:queue withHandler:
  ^(CMAccelerometerData *data, NSError *error) {
      // 加速度データを取得した時に呼び出されるブロック
      NSLog(@"%f,%f,%f,%f", data.timestamp, 
       data.acceleration.x, data.acceleration.y, data.acceleration.z);
  }
];

2012年1月19日木曜日

複数ビューの呼び出し

iPhoneアプリを作成していくにつれ、1画面で動作するアプリではなく、複数の画面を切り替えたほうがいいケースもたくさんでてくるかと思います。
複数のビューの切り替え方法と準備する流れをメモっておきます
①二個目ののビューコントローラーを作成

適当ななまえをつけます
②xibファイルを追加
user interface→viewを選択、適当な名前をつける
③xibファイルの設定を行う
xibファイルを選択し、File'sOwnerを選択して、右ペインの赤丸の部分を選択。
CustomClassのClassを先ほど追加したビューコントローラーの名前を選ぶ。

④コーディング
最初のビューから二個目のビューを呼び出すので
最初のビューの.mファイルに二個目のビューコントローラーのヘッダファイルをimportし、下記のようなコードでxibファイル名を指定してあげます



2012年1月17日火曜日

僕がObjectiveCに苦戦する理由

ObjectiveCの勉強をはじめて、プログラムの組み立て方やや部分部分での動きはつかめてきたのですが、いまいち書いた処理がどのような順番で呼び出されているか、たくさんヘッダファイルがあるがどのように関連しているかなどがいまいちつかみにくく、苦戦しています。
なぜこんなに苦戦しているかを考えると、PHPなどサーバーサイドのプログラムを見てきたので、イベントドリブンなプログラムの頭で見ているからなのかなと思いました。
考え方の転換を図りたいところです。プログラムの動き方について良い資料を探してそこを理解することから始めたほうがいいような気がしてきました。

ObjectiveC学習サイト

スタンフォード大学のiOSプログラミングコースの教材がとてもわかりやすく、サンプルソースも書いてあるので今週は教材を見ながら学習をしています。

ObjectiveCを学んでいる方はおすすめです!

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/