2011年4月27日水曜日

キー値監視について

監視元1に対して監視先オブジェクトを複数作れる通知方法。
キーに関連づける値は一個じゃなくてもいいので依存度があまり高くない。
呼び出しメソッドの第2引数には監視先オブジェクトが入る。
第3、4は…よくわかってないです。
登録の解除は忘れずに。

/*---------監視するクラス---------*/

//ViewControllerの場合はwillAppearその他はinitでキー監視の宣言
-(void)viewWillAppear:(BOOL)animated{
      KansiClass * kansi = [[KansiClass alloc] init];
    //キー値監視登録
     [kansi addObserver:self forKeyPath:@"keyPath"
                            options:0 context:NULL];
}

//監視キーに変更があった場合に呼び出される
-(void)observeValueForKeyPath:(NSString*)keyPath
                                             ofObject:(id)object
                                                change:(NSDictionary*)change
                                                context:(void*)context{
       if([keyPath isEqualToString:@"keyPath"]){
               //値変更したらこのクラスでやりたいことを記述
        }
}

-(void)dealloc{
//登録の解除
      [kansi removeObserver:self forKeyPath:@"keyPath"];
   [kansi release];
      [super dealloc];
}
/*---------監視されるクラス内---------*/

-(void)changeKansi{
      [self willChangeValueForKey:@"keyPath"];
      //監視値の変更
      kansiValue = FALSE;
     [self didChangeValueForKey:@"keyPath"];
}

2011年3月3日木曜日

iPad2のミラーリング機能

iPad2が正式に発表されましたね。
なんとミラーリング機能が追加されたとか。…やっとか;
Apple Digital AVアダプタが必要らしいです。

↓詳しくはこちら↓
あなたの画面を共有しよう!Apple Digital AVアダプタ。

Apple Digital AVアダプタがあっても
iPad2以外はミラーリングできないとか。へえ。

2011年3月1日火曜日

ホームボタン押下でアプリを起動時の状態にリセットする※iOS4.0以降

iOS4.0以降はマルチタスクなのでホームボタン押下では
アプリは一時停止するだけです。次立ち上げた時は前回状態に復帰します。
これをFast App Switchingというらしい。

でもホームボタンを押したら4.0以前のように
アプリを完全終了させたいケースもある訳です。
ログイン系とかテストとかメモリとかメモリとかメモリとか。
それを可能にするのがApplication does not run in backgroundの設定です。

設定方法はプロジェクト名.plistで
Application does not run in backgroundの項目を追加し、
チェックをつけるだけ。

通常は4.0以降の実機やシュミレータにてビルドして実行した際ホームボタン押下で
プロジェクト起動しっぱなしですが、チェックを入れた際にホームボタン押下で
デバッグが終了しましたと、xcode上のステータスに表示されます。
覚えておくと便利かも。

※起動時には戻るとはいえ、アプリ自体はサスペンドにはいます。
 サスペンドから復帰させた時に起動画面に戻るだけです。
 完全終了でサスペンドからも消す方法はないんじゃないかと。

transformの合成、アニメーション基本(ちょっと修正

だいたいこんな感じ。Viewのtransformは常に上書きされる。
90度回転をtransformに設定した後、拡大を設定すると
90度回転はなかったことになってるので注意。
回転した状態で拡大する場合はCGAffineTransformConcatで
transformを合成して設定する必要がある。
ちなみに
animeView.transform = CGAffineTransformIdentity;
で初期状態にもどる

*3/1修正 回転も拡大縮小も中心起点だった;
      アフィン変換いまいちわかってないなー。
-(void)startAnime:(UIView*)animeView{
 //開始前に縮小しておく
 animeView.transform = CGAffineTransformMakeScale(0.1, 0.1);
 //アニメーション設定開始
 [UIView beginAnimations:nil context:NULL];
 //アニメーションの秒数
 [UIView setAnimationDuration:0.3];
 //動きの設定
 [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
 //delegate設定(endAnimeがいらないならnilでOK)
 [UIView setAnimationDelegate:self];
 //アニメーション終了後にやりたい処理
 [UIView setAnimationDidStopSelector:@selector(endAnime)];

 //90度回転しながら元の大きさに拡大
 CGAffineTransform transform1,transform2;
 transform1 = CGAffineTransformMakeRotation(M_PI * 90 / 180.0f);
 /*
 //ちなみに移動はこれ 
 transform1 = CGAffineTransformTranslate(transform1, 128, 128);
 */
 //拡大
 transform2=CGAffineTransformMakeScale(1.0, 1.0);
 //transformの合成
 CGAffineTransform concat = 
  CGAffineTransformConcat(transform1, transform2);
 //transformの適用
 [animeView setTransform:concat];
 //アニメーション設定終了
 [UIView commitAnimations];
}

-(void)endAnime{
 //アニメーション終了後にやりたい処理を書く
}

2011年2月28日月曜日

debugビルド以外NSLogを出さない

プロジェクトのOther Sourcesフォルダ内のアプリ名_Prefix.pchに以下を追加。
これを使うにはプリプロセッサにDEBUGを追加する必要あり詳しくはこっち
// Debbugログ出力切り替え
#ifdef DEBUG
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif

NSNotificationの登録

//登録(didloadなどで)
[[NSNotificationCenter defaultCenter] addObserver:class 
selector:@selector(yobimethod:) name:@"notificationName" object:nil];

/*class内*/

-(void)yobu{//呼び出し※引数はなくてもOK 
   NSDictionary *userInfo = 
   [NSDictionary dictionaryWithObject:obj forKey:@"objkey"];
   
   [[NSNotificationCenter defaultCenter] postNotificationName:
        @"notificationName" object:nil userInfo:userInfo];
}


//呼び出されるメソッド
-(void)yobimethod:(NSNotification *)notification{
  NSString*key = [[notification userInfo] objectForKey:@"objkey"];
}

2011年2月24日木曜日

角丸UIView

#import <QuartzCore/QuartzCore.h>//使用クラスにインポートの必要あり

-(void)createKadomaru{
 UIView * maru = [[[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)] autorelease];
 maru.center = self.view.center;
 maru.backgroundColor = [UIColor whiteColor];
 maru.layer.cornerRadius = 4.0;//角の丸み 値が大きいほど丸い
 maru.clipsToBounds = YES;
 [self.view addSubview:maru];
}

←完成はこんな感じ。
今まで角丸部分は画像を用意してたのに…
これは便利。QuartzCoreのインポートを忘れないこと。
clipsToBoundsはUIViewのプロパティでYESならサブビューを
メインビューの内側に描画。(デフォルトはNO)