iPhoneプログラミングメモ。
動的に作成したUILabelの文字サイズを自動的にリサイズする方法です。
文字が表示枠からはみ出す時などに適用されます。
InterfaceBuilderでは簡単に設定できますよね。
label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 25); label.font = [UIFont systemFontOfSize:20]; label.adjustsFontSizeToFitWidth = YES; label.minimumFontSize = 14; [self addSubview:label]; [label release];
fontプロパティで通常時の文字サイズを指定し、
adjustsFontSizeToFitWidthプロパティで自動リサイズを設定。
minimumFontSizeプロパティで最小フォントサイズを指定します。
iPhoneプログラミングメモ。
UIScrollViewで任意の位置にスクロールする方法。
zoomToRectメソッドで表示する範囲を指定するだけという簡単さ。
CGRect rect = CGRectMake( 100,200, 400, 400 ); [scrollView zoomToRect:rect animated:YES];
しかし現在表示している範囲と上記で指定したサイズが違う場合
スケールが変わってしまいます。
出来る事ならスケールは変えたくないという場合がありますよね。
そんな時は現在のスケールを再指定してあげます。
// 現在のスケール float scale = scrollView.zoomScale; // ズームスクロール CGRect rect = CGRectMake( 100,200, 400, 400 ); [scrollView zoomToRect:rect animated:YES]; // スケールを再指定 [scrollView setZoomScale:scale];
もっと面倒かと思ったらえらい簡単でびっくりしましたw
iPhone/iPadプログラミングメモ。
縦横どちらの画面でも中心に表示される UIViewを作っていたのですが、
[[UIDevice currentDevice] orientation]
を使っていたら実機で上手くいかなかったのでメモしておきます。
まず、上手くいかなかった理由としては UIDeviceの orientationプロパティには
回転方向だけでなく、画面が上向きか下向きかも存在していたからです。
それぞれ UIDeviceOrientationFaceUp、UIDeviceOrientationFaceDownです。
orientationプロパティでは「縦画面か横画面か」ではなく、本体の向き
であることを覚えておく必要があります。
対応策として、orientationプロパティを保存しておくことにしました。
UIViewでアニメーションを行った後に実行するメソッドを
外部から指定することって出来ないかなーと思ってこんなふうに書いてみました。
結果としてエラーになったんですが、メソッドを渡すことって出来ないのかなぁ。
できました! 単なるタイプミスだったようです。^^;
-(void)startDialogAnimation:(id)delegateTarget action:(SEL)action{ // アニメーション前準備 // 画面の外にいったん出す CGRect frame = hogeView.frame; frame.origin.y = -100; [hogeView setFrame:frame]; // アニメーション設定 // 受け取ったオブジェクトとセレクターを設定してみた CGContextRef context = UIGraphicsGetCurrentContext(); [UIView beginAnimations:nil context:context]; [UIView setAnimationDelegate:delegateTarget]; [UIView setAnimationDidStopSelector:action]; [UIView setAnimationDuration:0.5]; // アニメーションの完了値 CGRect lastFrame =hogeView.frame; lastFrame.origin.y =300; [hogeView setFrame:lastFrame]; [UIView commitAnimations] }
呼び出すときはこんな感じ。
[dialogView startDialogAnimation:self action:@selector(hogeMethod)];
iPhone/iPadプログラミングメモ。
iPhoneアプリを作るとき icon.png という名前で 57x57(iPadは72x72)ピクセルの
画像をXcodeに読み込ませれば自動的にアプリケーションのアイコンに
設定されてくれます。
ご丁寧なことに光沢エフェクト(グラデーションエフェクト)までついてくれる
のですが、それを消す方法。
info.plist に「UIPrerenderedIcon」という項目を作り、True(チェックを入れる)に
設定すればいいそうな。
ちなみに Xcode 3.2.3でやったら
Icon already includes gloss effects
という名前に自動変換されました。
ちなみにアイコンについては「ヒューマン インターフェイス ガイドライン」に
掲載されているのですが、ファイル名については書かれてませんでした。
iPhone4になって解像度があがり、必然的にアイコンの画素数も変わりました。
NAGAOKA STATIONさんのまとめによると
下記のような感じらしいです。多っ!!
Icon.png : 57 x 57
[email protected] : 114 x 114
Icon-72.png : 72 x 72
Icon-Small.png : 29 x 29
[email protected] : 58 x 58
Icon-Small-50.png : 50 x 50
Default.png : 320×480
[email protected] : 640 x 960
Default-Landscape.png : 768 x 1024
Default-Portrait.png : 768 x 1024
Default-LandscapeRight.png : 768 x 1024
Default-LandscapeLeft.png : 768 x 1024
Default-LandscapeDown.png : 768 x 1024
アイコン関係はこのへんも参考になりそう。
iPhoneプログラミングメモ。
シミュレータだと問題ないのに実機で動作させると画像が表示されない。
調べてみるとファイル名の大文字小文字問題があるとか。
シミュレータ…大文字小文字区別ナシ
実機…区別アリ
でも今回ワタクシが遭遇したのはファイル名の間違いは一切なく、
仕様なのかバグなのかよくわからないものでした。
Xcode>キャッシュを空にする
ビルド>すべてのターゲットをクリーニング
もやってみたのですが治りませんでした。
で、自分の場合は下記の方法で治りました。
単純に画像を再登録するだけなのですが、リンク切れを意図的に発生させています。
なんなんでしょうねえ。
iPhoneプラグラミングメモ。
たとえばコミケのスペースの座標をまとめた配列を作るとき
「Aブロックの、1番目の、左上座標」みたいな表になるわけですが
NSDictionary *mapPosList = [NSDictionary dictionaryWithObjectsAndKeys: [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:100], @"left", [NSNumber numberWithInt:200], @"top", [NSNumber numberWithInt:50], @"width", [NSNumber numberWithInt:125], @"height", nil ], nil ], @"A", nil ]; NSLog(@"%d", [[[[mapPosList objectForKey:@"A"] objectAtIndex:0] objectForKey:@"left"] intValue]);
という感じの、一目みてもわけわからん定義と呼び出しになるわけです。
もっとスマートな記述方法ないですかねえ…。
ActionScriptや JavaScriptに慣れていると
var mapPosList:Objects = { "A":[ {left:100, top:200, width:50, height:125} ] }; trace( mapPosList['A'][0].left );
くらいシンプルなのが当たり前だからなぁ…。
XMLで座標一覧作って、XPath使うのが一番スマートかもしれない。
全データ舐めるってわけじゃないし。
動的に複数のボタンを作っていたら、ボタンを押したとたん落ちてしまう。
そんな状態にハマりました。^^;
CGRect rect = CGRectMake(mapX, mapY, MAP_DESK_YOKO_W, MAP_DESK_YOKO_H); UIButton *button = [[UIButton alloc]initWithFrame: rect]; [button addTarget:self action:@selector(mapButtonTouch) forControlEvents:UIControlEventTouchUpInside]; [button setBackgroundColor:[UIColor redColor]]; button.tag = count;
comikechk[4537:207] *** -[ComikeMapViewController mapButtonTouch]: unrecognized selector sent to instance 0x48609a0
なんだろーなんだろーと検索しても有効な情報が得られない。
ふと、作例を載せているサイトを見ていたら…あっ!!
[button addTarget:self action:@selector(mapButtonTouch:) forControlEvents:UIControlEventTouchUpInside];
@selectorでメソッドを指定する時に最期の「:」を付け忘れただけでした。
うわー、まぬけすぎるw
iPhoneプログラミングメモ。
処理進行中を表すために用いられるくるくる回るアニメーション
UIActivityIndicatorView が用いられますが、解放関係でハマったのでメモ。
[indicator stopAnimating]; [indicator removeFromSuperview]; [indicator release];
アニメーションをストップして、ビューから外して、解放しています。
が、このコードだと
-[UIActivityIndicatorView stopAnimating]: message sent to deallocated instance
なんてエラーになってしまいました。
releaseの後にさらに nilを代入したら問題なく動作するようになりました。
[indicator stopAnimating]; [indicator removeFromSuperview]; [indicator release]; indicator = nil;
おそらく他の部分で UIActivityIndicatorViewインスタンスの有無を
チェックして処理をわけている箇所があるので、そのへんが関係あるのかも。
ないのかも。
if( indidator ){ 〜くるくるアニメがある時の処理〜 }
あとはこのへんが多少なりとも関係しているんでしょうか?
はじめてのあいぱっどあぷり。
略して「はじあい」。
そんなワタクシですが無謀にもCoreDataにまで手を出しています。
で、日本語検索が出来なくてハマったのでメモ。
「day」という項目に曜日が格納されており、
それごとにデータを抽出しようとしています。
「dayList」は曜日一覧をまとめたNSArray。
「gNowDay」は現在表示させたい曜日の番号です。
NSPredicate *preDay = [NSPredicate predicateWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; [request setPredicate:preDay];
これだとダメでした。
「'%@'」の部分を「'土'」など決め打ちにしたらいけました。
次はうまくいったコード。
NSString *preDayStr = [NSString stringWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; NSPredicate *preDay = [NSPredicate predicateWithFormat:preDayStr]; [request setPredicate:preDay];
一度NSStringに格納してからやったら出来ました。
そういうもんなのかー。
そしてこれは複合条件の指定。NSCompoundPredicateを使います。
「土曜の東館」とか指定するわけですね。
NSString *preDayStr = [NSString stringWithFormat:@"day == '%@'", [dayList objectAtIndex:gNowDay]]; NSPredicate *preDay = [NSPredicate predicateWithFormat:preDayStr]; NSPredicate *preArea = [NSPredicate predicateWithFormat: @"areaCode == %d",areaCode]; NSPredicate *allPre = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: preArea, preDay, nil]]; [request setPredicate:allPre];