投稿

9月, 2012の投稿を表示しています

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 button on the right
UI…

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 kAudioUnitSampleFractionBits 24
#endif

ちなみにCA_PREF…

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は部品内に行われてタッチイベント監視権のようなものを部品が持つ必要があるようです。