2010年11月29日月曜日

SQLiteのDBにUIImageを格納する

UIImage→NSDateに変換後、DBに突っ込むらしい。
そもそもバイナリデータを突っ込めることを知らなかった…。

*参考記事*
iPhone SDK でUIImageの画像をSQLiteのDBに格納する方法

iPhoneSDKでSQLiteを使う方法

2010年11月24日水曜日

initのオーバーライド

TestView*view=[[TestView alloc]init];
TestViewController *VC = 
[[TestViewController alloc] initWithNibName:
 @"TestViewController" bundle:[NSBundle mainBundle]];
UIView、xib付きUIViewControllerの初期化時にオーバライド(ロード)する場合は
以下をそれぞれのサブクラスに書く。※クラスにオーバロードのメソッド宣言すれば引数を渡す初期化も可能

*UIView
- (id)init {
 self = [super init];
 if (self != nil) {
   NSLog(@"ここに初期化したい処理を追加する");
 }
 return self;
}

*xib付きUIViewController
- (id)initWithNibName:(NSString *)nibNameOrNil 
      bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:@"TestViewController" bundle:nibBundleOrNil]) {
       NSLog(@"ここに初期化したい処理を追加する");
    }
    return self;
}
*Frame付き
- (id)initWithFrame:(CGRect)frame{
 if ((self = [super initWithFrame:frame])) {
  NSLog(@"ここに初期化したい処理を追加する");
 }
 return self;
}

ナビゲーションバーに複数ボタンを配置する

InterfaceBuilderベースの場合は以下の前準備が必要 
全部Xcode上でUIを生成してももちろんOK
*IBで下準備*
・カスタマイズしたいナビゲーションバーのあるxibを開く
・追加したいボタンをUIToolbarに乗せたものをview外に作る
※右寄、左寄の両方のボタンをカスタマイズしたい場合はUIToolbarを二つ作る
・UIToolbarの全体の大きさはボタンの数によって横幅を変更する
・作ったツールバーとナビゲーションバーを管理するクラスをIBOutletで繋ぐ
・ボタンのアクションがある場合は同クラスにIBActionを繋ぐ

*X-codeでカスタマイズしたツールバーを乗せる*
UINavigationControllerを管理するクラスのViewdidLoadで以下を呼び出す

//rightButtonsが右寄のボタンをまとめたUIToolBar
//leftButtonsが左寄のボタンをまとめたUIToolBar
-(void)createNaviButtons{ 
 //ツールバーの背景色をナビバーと合わせる
 [rightButtons setTintColor:
   [self.navigationController.navigationBar tintColor]];
 [leftButtons setTintColor:
   [self.navigationController.navigationBar tintColor]];

 //カスタムビューを設定する
 self.navigationItem.leftBarButtonItem
    =[[[UIBarButtonItem alloc]initWithCustomView:leftButtons] autorelease];
 self.navigationItem.rightBarButtonItem
  =[[[UIBarButtonItem alloc]initWithCustomView:rightButtons] autorelease];
}

※問題点
ナビゲーションでプロンプト表示した時にツールバーが
乗っていると背景でばれてしまう。

シミュレータのバグ

シミュレータでInstrumentsのLeakを調べると、
起動時にMalloc128biteとリークの表示されるが
実機では表示されない。シミュレータのバグらしい。

リジェクト規約

リジェクト対象項目が日本語で。ありがたい。
*参考サイト*
iPhoneアプリ審査での111の禁止項目(意訳)

2010年11月11日木曜日

UIButtonの同時押し防止

マルチタップさせたくないボタンなどに
exclusiveTouchのプロパティを設定する
exclusiveTouch
UIViewのプロパティ。YESなら同ウインドウ内の他ビューにおける
タッチイベントを受け付けない。デフォルト:NO

multitapcancelbtn.exclusiveTouch=YES;

2010年11月9日火曜日

UIScrollView 拡大率を変えずにフォーカス

[scrollView zoomToRect:CGRect]でズームフォーカス。
拡大率をかえたくない場合は以下。
// 現在のスケール
float scale = scrollV.zoomScale;
// ズームスクロール
CGRect rect = CGRectMake(0,0,10,10);
[scrollV zoomToRect:rect animated:YES];
// スケールを再指定
[scrollV setZoomScale:scale];

*参考記事*

UIScrollViewで任意の位置にスクロール

性能測定を行うマクロ

hファイルに以下を定義
#define BM_START(name) NSDate *name##_start = [NSDate new]
#define BM_END(name) NSDate *name##_end = [NSDate new];\
NSLog(@"%s interval: %f", #name, [name##_end timeIntervalSinceDate:name##_start]);\
[name##_start release];[name##_end release]

計測したい箇所に下記を記入。
BM_START(name);
/* 計測したい箇所 */
BM_END(name);

コンソールにname部分に入れた名前で秒数が表示される。
シミュレータと実機で計測結果は異なるのでなるべく実機で計測する。

*参考記事*
Objective-Cでちょっとした性能測定を行うマクロ

UIColorの便利な定義

hファイルで以下を定義するとrgbカラー指定が楽になる
#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]
#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

使用例
//色のみ
 testLabel.textColor = RGB(255, 251, 204);
//透過も指定
 testLabel2.textColor = RGBA(255, 251, 204, 0.5);

*参考記事*
UIColor Macros

typdef enum の使い方

hファイルのimport下に書く
typedef enum{
CASE_0=0,
CASE_1,
CASE_2 
} TEST_ENUM;   

enumを記述したクラスをインポートすれば数字の代わりに使える。
引数などに設定する場合は
-(void)test:(TEST_ENUM)case;