2009年9月25日金曜日

Mac:ロジクール Bluetooth Mouse M555b





Mac Book Proはトラックパッドがものすごく使いやすいのであまりマウスの必要は無いのですが、ドラッグ&ドロップを多用するような作業だけはマウスの方が効率がよいと思いますので、マウスを購入しました。


ロジクール Bluetooth Mouse M555bです。
Mighty Mouseは、クリックが重い感じがしてなじめず、やめました。







このロジクールのマウスもとても格好がよく、Macにあってなくも無いような気がします。


このマウスの上面には小さいボタンがあってExpose等に割り当てて便利に使えるのですが、Snow Leopardにアップデートしてから、Exposeがきかなくなっていました。22日にドライバが更新されて無事使えるようになりました。


2009年9月12日土曜日

iPhone:文字列のローカライズ

文字列のローカライズの方法をメモします。

(1)Resourceに新規ファイル”Localizable.strings”を追加します。

(2)1で作成したファイルの情報を開き、”一般”タブ>”ローカライズを可能にする”ボタンを押します。

(3)一般タブに戻るとローカリゼーションリストが表示されます。
最初はEnglishだけなので、Japaneseを追加します。

(4) strings ファイルを編集します。
 記述例

 English
  "Cancel" = "Cancel";
 Japanese
  "Cancel" = "キャンセル";

(5)ファイルはUTF-16で保存する必要があるようです。
ファイルを開いた状態で 表示>テキスト>ファイルエンコーディング>UTF-16

(6)ソースコードの文字列を使用する処理の記述を変更します。
  string = NSLocalizedString(@"Cancel",nil)

2009年9月8日火曜日

iPhone:Safariでウェブページを開く

Safariでウェブページを開くサンプルコードです。

UIApplication* app = [UIApplication sharedApplication];
NSURL* url = [NSURL URLWithString:@
http://google.co.jp];
[app openURL:url];

iPhone:ソースコードに区切りを入れる #pragma mark

ソースコード内のメソッドを分類して、その仕切りに以下のようなコードを挿入します。
#pragma mark -
#pragma mark Application lifecycle

すると、XCodeのメソッドリストでは以下のように区切って表示されます。

2009年9月7日月曜日

iPhone:Xib/Nibファイル(その2) カスタムクラスのインスタンスをNibファイルに追加する

アプリケーションが複雑になってくると、全ての処理をXXXViewControllerに書くのではなく、カスタムクラスを作成することになります。

自分でカスタムクラスを作成し、そのクラスのインスタンスをNibファイルに入れる場合、Nibファイルによるインスタンスの初期化がどんな順番で実行されるかを気にして作成する必要があります。

作成したカスタムクラスをNibに追加する手順はこちらを参照してください。
InterfaceBuilderでカスタムクラスインスタンスを追加する場合、まずカタログから、追加したいクラスのスーパークラスを追加して、その後インスペクタウィンドウのIdentityタブでクラスを変更します。

UIApplicationもしくはUIViewControllerのサブクラスがNibに定義されたインスタンスを生成する手順は以下のようになります。


1.全てのインスタンスをallocする
2.全てのインスタンスのinitを実行する
3.全てのインスタンスに属性を入力(Outlet、Action、各種のパラメータ)する
4.全てのインスタンスのawakeFromNibを実行する

カスタムクラスを新規作成する場合、インスタンスの初期化処理は、init もしくは awakeFromNib 関数をオーバーライドします。
initがコールされる時点ではまだ他のインスタンスとの関連(Outlet)は出来ていないため、以下のような使い分けをします。
  • init ・・自分のインスタンスの初期化処理
  • awakeFromNib ・・Outletに接続されているインスタンスに対する処理
UIViewサブクラスのサブクラスを作成する
(1)Classesのコンテキストメニューで追加>新規ファイル
Objective-C Classを選択、リストからSubclass of UIViewを選択する
(2)Headerファイルを編集して継承元クラスを書く 例えば、UIImageViewに変更する
(3)IBでインスタンスを追加する
 スーパークラスをNibに追加してから、InspetorウィンドウのIdentityタブを選択し、Class Identityを編集する

iPhone:ステータスバーの表示/非表示

// アプリケーションのインスタンスを取得する
UIApplication* app = [UIApplication sharedApplication];

// ステータスバーの可視状態を変更する
app.statusBarHidden = YES;
(app.statusBarHidden = NO;)

iPhone:指定時間後にメソッドを実行

わざわざUITimerを使用せずに、指定した時間が経過した後にメソッドを実行する方法があります。UIObjectのperformSelectorメソッドを用います。

// 0.5秒後にメソッドを実行する
[self performSelector:@selector(xxxxxx)
withObject:nil
afterDelay:0.5f];

タップ回数を検出するサンプル
タップの回数に応じた処理を実装する場合、ユーザが次のタップをしないことを確認してから処理を開始する必要があります。そのためにperformSelectorを使用するサンプルです。

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch* touch = [touches anyObject];
switch (touch.tapCount) {
case 1:
[self performSelector:@selector(singleTap) withObject: nil afterDelay:0.4f];
break;
case 2:
// ...
break;
}
}


- (void) singleTap{
if (tapCount ==1 ) {
// 0.4秒経過後まだタップ数が1で有ればシングルタップと認識する
// 処理を記述
}
}

Macメモ:画面をキャプチャ

WindowsのPrint Screenのように画面のイメージを画像ファイルにする方法をメモします。

画面全体をキャプチャ
 コマンド+Shift+3
  
四角の領域を指定してキャプチャ
 コマンド+Shift+4 
  マウスポインタが変わるので、ドラッグで領域を指定します。

  
ウィンドウを選択してキャプチャ
 コマンドキー+Shift+4+Space 
  マウスポインタがカメラに変わったら、キャプチャしたいウィンドウを選択します。


デスクトップにpngファイルが作成されます。



2009年9月4日金曜日

iPhone:Xib/Nibファイル(その1)

[1]Xib/Nibファイルの役割
Xcode Interface Builderのファイルという意味ですが、伝統的にNibと呼ばれることが多いようです。
オブジェクトの状態を記録し、それを再現するためのファイルです。
Nibファイルには以下のような情報が記述されています。
  • どんなインスタンスを生成するか
  • インスタンスの持つ属性値
  • 他のインスタンスとの関連(Outlet、Action)
iPhoneアプリケーションは起動するときにNibファイルを読み込んでそこに書かれたインスタンスの状態を再現します。
NibファイルはUIApplicationかUIViewControllerのサブクラスによってロードされます。

[2]例:Window-Based Application Template
Window-Based Application Templateを用いてプロジェクトを新規作成した場合、以下のような構成になります。


・NibはMainWindow.xib一つだけです。
・UIApplicationがMainWindow.xibをロードします。これを、UIApplicationがMainWindow.xibのオーナーであるといいます。Interface BuilderでMainWindow.xibを開くと、UIApplicationはFile's Ownerと表現されています。
・MainWindow.xibは、図でグレーで示した領域のインスタンスの状態を記録しています。


[3]例:View-Based Application Template
View-Based Application Templateでプロジェクトを新規作成した場合は以下のような構成になります。


・Nibファイルは2つあります。
・MainWindow.XibのオーナーはUIApplicationです。
・XXXViewController.xibのオーナーはXXXViewControllerです。
・それぞれのNibファイルが、グレーで示した領域のインスタンスを状態を記録しています。

[4]例:View-Based Application Templateをもとに追加
View-Based Application Templateをもとに最も簡単なシングルビューアプリケーションを作成する場合、以下のようにします。


1.Interface BuilderでViewの中に部品を配置します
2.Interface Builderでそれぞれの部品の属性値を設定します
3.XCodeでXXXViewControllerにOutlet、Actionを定義し、Actionの処理を書きます
4.Interface BuilderでOutletやActionを接続する

1,2,4の成果はXXXViewController.xibに記録されています。

アプリケーションが起動と、まずUIApplicationがMainWindow.xibをロードし、次にXXXViewControllerがXXXViewController.xibをロードします。これで全部のインスタンスの生成と属性の設定が完了し、アプリケーションの起動プロセスが終了します。

2009年9月2日水曜日

iPhone:ランダムな数値を発生する

// 現在の日時を用いて乱数を初期化する
srand( [[NSDate date] timeInvervalSinceReferenceDate]);

// 乱数を発生
NSUInteger randomNumber = rand() % (max+1);

必要な乱数の最大値+1で割って余りを求めます。

iPhone:配列

[1]配列を扱う2つのクラス
  • NSArray :生成後に変更できない
  • NSMutableArray :生成後に変更可能
[2]配列による要素の保持と破棄
  • 配列に要素を格納すると、その要素が retain実行されます。
  • 配列を破棄すると、全ての登録済要素に対して releaseが実行されます。
  • 配列から要素を除去するメソッドを実行した場合、その要素に対して releaseが実行されます
[3]配列の生成
NSImage* image1 = [NSImage imageNamed: @"Image1.jpg"];
NSImage* image2 = [NSImage imageNamed: @"Image2.jpg"];
NSImage* image3 = [NSImage imageNamed: @"Image3.jpg"];
NSImage* image4 = [NSImage imageNamed: @"Image4.jpg"];
NSArray* imageArray = [NSArray arrayWithObjects : image1, image2, image3, image4, nil ];
nilを忘れずに最後に追加すること
[4]配列を参照する
// 配列の要素数を取得
NSInteger count = [imageArray count];
// 配列の中身を取得
int i;
for ( i=0 ; i < count ; i++ ){
NSLog( @"Item %d = %@", i, [imageArray ocjectAtIndex: i]);
}
[5]配列要素の追加・削除
配列の要素を動的に操作する場合にはNSMutableArrayを使用します。
//空の配列を作成
MSMutableArray* array = [MSMutableArray array];
追加 ・・addObject:
挿入 ・・insertObject: atIndex :
削除 ・・removeObjectAtIndex :
置換 ・・replaceObectAtIndex : withObject:
順番の入れかえ ・・exchangeObjectAtIndex : withObjectAtIndex

[6]XMLファイルから配列を読み込む


// XMLファイルのパスを取得
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource: @"xxxxx" ofType :@"plist"];



// XMLファイルを読み込む
NSArray* array = [NSArray arrayWithContentsOfFile: path];


プロパティリストの作成
(1)XCodeのResourceグループでコンテキストメニュー
追加>新規ファイルを実行

(2)”新規ファイル”ダイアログで、Mac OS X>Other>Property Listを選択
(3)編集する
・RootのTypeをArrayにすること