2010年12月24日金曜日

delegateとprotocolによる通知

delegateやらprotocolやらどっちに宣言するんだがごっちゃになるので図にしてみた。


たぶんこれであってる…はず。

2010年12月21日火曜日

UIViewからUIImageを生成

//UIViewからUIImage作成
- (UIImage *)createImage:(UIView *)view
{
    UIImage *createImage;
    UIGraphicsBeginImageContext(view.frame.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    createImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return createImage;
}
生成したUIImageがキャッシュに残るかは調べ中

追記:生成される画像はautoreleaseが走る…らしい。
   多分大丈夫?

2010年12月17日金曜日

ipadアプリの外部出力(ミラーリング)

フリーで素敵なソースがありました。

iPadの画面を外部モニタへ出力する「TVOutManager」

中を見たけど難しい…じっくり解析します。

何となく仕組みがわかったので追記;
使い方は
1.TVOutManagerクラスを使いたいプロジェクトに入れる
2.初期表示するビューコンにTVOutManager.hをインポート
3.切り替えスイッチを用意してオンで
[[TVOutManager sharedInstance] startTVOut];
オフで、
[[TVOutManager sharedInstance] stopTVOut];
を実行する
※確認にはiPad専用のVGAアダプタと外部出力モニタが必要

>iPad自体にミラーリング機能はない…不便だ

>TVOutManagerは実機で表示しているスクリーンを画像化して、
 外部出力に貼付ける作業を別スレッドで定期的に行う
 ことでミラーリングしているようにみせているっぽい

>どうやらスクロールなど他の処理が走っている際には
 画像の更新を行わない。スクロールはかくかく表示になる 

>viewdidloadにスタートメソッドを入れてもなぜかうまく
 動作しない。明示的にボタンなどでスタートさせないとうまく行かなかった。
 viewdidloadにタイマー仕込んでも駄目だった。

>実機の回転対応はするが、やたらと回転する。修正が必要?
(初期画面がlandscapeだと縦に表示されてしまうなどの問題も)

>外部と実機2つのwindowに同じインスタンスを乗せることができない…?
 これができたらわざわざ画像化なんてしないか…。

わーJailbreakしてしまいたいー。

*外部出力で参考になった記事*
[iPad] 外部ディスプレイに出力する
[iPad] 外部出力方法
iPadからVGA出力
iPadでの外部モニタ出力←Jailbreakの方法も

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とリークの表示されるが
実機では表示されない。シミュレータのバグらしい。