2011年6月16日木曜日

デフォルトフォント

意外に知ってると便利なのでデフォルトシリーズは
ここに書き出していく予定。
ログ出したらこうなった。

UIButtonのデフォルトフォント(xcode上で作成の場合)
 font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 18px
 ※xibから作ったUIButtonのデフォルトフォント違うかもしれん

2011年6月1日水曜日

NSDictionaryの高速列挙

allValuesをつけると直接オブジェクトを取り出せるので覚えておくと便利かも。
そのかわりキーわからんけども。

-(void)firstEnum:(NSDictionary *)dict{
     for(NSString * keyname in dict){
            NSLog(@"キーは%@",keyname);
     }

     for(id obj in [dict allValues]){
            NSLog(@"オブジェクトは%@",obj);
     }
}

2011年5月28日土曜日

例外処理とAutoreleasePool

例外処理内で作ったAutoreleasePoolは@fainallyで解放しなくていいらしい

-(NSMutableArray *)testes{
 NSMutableArray * returnArr = [NSMutableArray array];
     @try{
       for(int Cnt= 0;Cnt<100;Cnt++){
           NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
       //[returnArr addObject:@"なにか"];  
            NSLog(@"%d番目は%@",Cnt,[returnArr objectAtindex:Cnt]);//←例外発生
            [pool release];//ここにはこない
       }
     }@catch (NSException * e) {
           NSLog(@"%@",e);
     }@finally {
     //pool解放なし
     }
     return returnArr;
}
…逆に今までfinallyに書いてたからクラッシュしてたのかしらー。

参考 NSAutoreleasePool祭り

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{
 //アニメーション終了後にやりたい処理を書く
}