投稿

supportedInterfaceOrientations

iOS6から画面の回転に関する処理が変わりました。 ViewControllerに2つのメソッド、 (BOOL)shouldAutorotate (NSUInteger)supportedInterfaceOrientations を追加します。 これらのメソッドの大まかな説明は省きます。 この(NSUInteger)supportedInterfaceOrientationsの戻り値ですが、 UIInterfaceOrientationMaskPortraitのような 〜Mask〜 というものを指定します。 これは各ビットがそれぞれの方向に対応しており、どの方向に対応するかを一つの変数で表せます。 Portrait基本形のみ対応する場合でもUIInterfaceOrientationMaskPortraitというMask付きのものを指定します。単一指定ならMaskがついてなくても値は同じだろうと早とちりしてしまいUIInterfaceOrientationPortrait(Maskが付かないやつ)を指定してしまうと、 Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES という実行時エラーが出ます。 定義を調べると以下のようになっています。 typedefが少し独特ですが、どこかで#defineされているんでしょう。 typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home bu...

AudioUnit細かいことまとめ

AudioUnitに出てくる細かいことについて void * int *と同じようにポインタですが、int *との違いはポインタの指す先です。int *の場合はintですが、void *の場合はどのような型でもよいです。使用するときには状況に応じてキャストすることもある。 関数ポインタ 関数ポインタは検索すると説明しているページがたくさん出てきます。関数へのポインタなのですが、AudioUnitでは関数の引数として関数を渡すときに使います。 関数ポインタの中でもtypedefを使った宣言の理解が難しい。 普通のtypedefは typedef int abc; で「abcをintとして扱う」「abcにintと同じ役割を与える」というような意味になります。「何を」と「何として」がスペースを挟んで書かれています。 関数ポインタのtypedefは typedef int (*abcd)(int a,int b); というようになります。 これに対し、同じように「何を」と「何として」をスペースを挟んで解釈しようとすると混乱します。 関数ポインタの場合は 「何を」abcd 「何として」int (*)(int a,int b) 引数をintで2つ持つ、戻り値がintの関数のポインタ という変則的な読み方をします。 AudioUnitSampleTypeとAudioSampleType iOS5.xだと実機でもシミュレータでもIntのほうが定義されています。 /*! @typedef AudioSampleType @abstract The canonical audio sample type used by the various CoreAudio APIs */ #if !CA_PREFER_FIXED_POINT typedef Float32 AudioSampleType; typedef Float32 AudioUnitSampleType; #else typedef SInt16 AudioSampleType; typedef SInt32 AudioUnitSampleType; #define kAudioUnitS...

finished running

Xcode4.2で新規プロジェクトを作り、iPod touch 3rd 8G(iPhone 3Gに相当)でiOS3.1.3の実機で動かそうとすると、すぐに起動が終わってしまい finished running 〇〇 というのがXcodeに表示される。 原因はiPod touch 3rd 8GのCPUがarmv6であるため。 対応は 〇〇info.plistでrequired device capavilitiesのarmv7を削除するのとBuildSettingのArchitecturesをarmv6を追加すること。 下記参照。〇〇info.plistの方は見落としがちなので注意。 stackoverflow.com

タッチイベント動作の名前

ボタンなどのUI部品へのタッチ動作をメソッドに結びつける際、どのタッチ動作かを指定します。タッチしたとか指を離したとかドラッグしたとか。 この動作の中に TouchDragEnter TouchDragExit TouchDragInside TouchDragOutside の4つがありますが、TouchDragEnterとTouchDragInside、TouchDragExitとTouchDragOutsideの違いがわかりませんでした。 調べてみると TouchDragEnter ドラッグで部品外の領域から中に入ってきた(ただしTouchDownは部品内で行われ、一度外に出てから入ってきた場合) TouchDragExit ドラッグで部品内の領域から外に出た TouchDragInside 部品内の領域でドラッグ TouchDragOutside 部品外の領域でドラッグ(ただしTouchDownは部品内で行われ、外に出た場合) とのことでした。 注意点としてはEnterとOutsideは、これらのイベントをトリガーにしてメソッドを呼び出したい時、Downは部品内に行われてタッチイベント監視権のようなものを部品が持つ必要があるようです。

const char *argv[]

iOSプログラミングでmain関数ってあまりじっくり見る機会がないんだけどよく見ると const char *argv[] っていう引数が結構難解。 文法通りの結果になるような私なりの解釈を書いてみる。これは人によって違いがあると思う。 まずchar *argv[]の解釈だが、そのまえにポインタと配列の宣言の分析をする。 int *abc; これは、*をつけてアクセスしたものはint型(つまりintへのポインタ)で、名前はabcというものを宣言。 int abc[]; これは各要素はintである配列で、名前はabcというものを宣言。 これをふまえてchar *argv[]を考えると *よりも[]のほうが優先順位が高いのでこの順番で解釈し、 ある配列がある。その各要素は*をつけてアクセスするとcharになるもで、その名前(配列の名前)はargv。と解釈し、argv[]はchar型へのポインタの配列で、argvと配列名だけで使用するとその先頭要素を指す。配列の要素のargv[0]はchar型へのポインタ。 また優先順位を意図的に変えたchar (*argv)[]だと、こちらのページが詳しく書いてある。 今こそ再考察! C言語ポインタ徹底解説 「配列へのポインタ」と「2次元配列(配列の配列)」の関係 http://news.mynavi.jp/articles/2008/04/18/pointer/003.html 4ページあるうちの4ページ目です。1ページ目から内容が良いので読むことをおすすめします。 この(*argv)の部分だが「配列の名前が先頭要素へのポインタだから、さらにそれを指すポインタ」と解釈したら間違いらしい。argvはポインタだが指す先は配列の先頭要素。だとすると、*をつけたときとつけないときで何が違うか、というのを疑問に思うが、それも上のページに詳しく書いてある。*をつけるとポインタ加算命令に対して配列ひとつ分進むらしい。なので宣言時に配列の要素数は必須。上のchar (*argv)[]はXcodeのコンパイラだとポインタ演算のところでエラー。 ちなみに配列の名前はポインタと近いが微妙な違いがある。 char *argv[]の間違った解釈としては char型の配列があってその先頭要素を指すポインタをさらに指...

用語

Targeted Device Family iPadアプリか、iPhone/iPod touchアプリか、両方か Project名 .projectファイルの名前 Product name 一体何か? Bundle name 実行ファイルのトップのフォルダに付けられる名前 Executable name 実行ファイル名? Target名 ターゲットの名前 Schime名 スキームの名前

iPhone Core Audioプログラミング

iPhone Core Audioプログラミングという本の感想。 iOSで音を出すやりかたは4パターンほどあります。それぞれ、作りやすさ、機能、理解しやすさなどが違います。全部を網羅しようとすると結構大変なのですが日本語で書かれたiPhone Core Audioプログラミングという良書がありますので助かります。 最初本屋でぱらぱらと見た感じではかなり難しそうな印象があります。特にC言語による部分はObjective-Cに慣れた目には完全に別言語に見えます。 しかし、何度も読んでいくうちにだんだんとCore Audioのパターンが見えてきます。その山を超えるとわりと楽に読めるようになります。 chapter 1 System Sound Service 効果音用のAPIの説明。初めのchapterにしては結構いろんなことが詰め込んである。読むペースをつかむ前に次から次へと話題が変わるので注意。コールバックというのが理解できない場合はchapter 2 AVFoundationを検討するのもいいと思います。 chapter 2 AVFoundation 音を出すAPIの中でこのAPIが一番わかりやすい。ARCならreleaseも必要なし。 chapter 3 項目が多いがひとつひとつは単純な知識。 オーディオフォーマットの情報とパケットの情報を混乱しないようにする。 iOSアプリからプログラムを始めた人は、取得したいデータのアドレスを関数の引数として渡すやり方がイメージしにくいかもしれない。このやり方はCoreAudioではすごくよく使う。 chapter 4 AudioSessionの基礎 ここはどんなアプリを作る場合でも目を通しておいたほうがよいでしょう。 ユーザーの使用状況に応じて音の出力の挙動を変化させること方法が書いてあります。 内容は主に2つ、カテゴリ(アプリは音の扱いをどうするか、マナーモード?に従うとか)の設定と割り込み(電話受信など)への対応。 この割り込みへの対応に2つのやり方が紹介されている。一つは直接AudioSessionを扱うやり方、もうひとつはAVAudioPlayerの機能を使うやり方。 AVAudioPlayerはサウンドの扱いを簡単にするために割と後から出来たもの。ソースから想像するにAV...