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
アイコン関係はこのへんも参考になりそう。
作ろうとしたらProgressionプロジェクトの新規作成のところで何故かAdobeAIRが選べない。
おかしいなーと思いつつAdobe Flash Support Centerから
Adobe Flash CS4 Professional Update (10.0.2) 05/13/2009
を落としてきてインストールしたら選べるようになりました。
あれ?前に作ったのってマシン環境新しくする前だったっけ?
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使うのが一番スマートかもしれない。
全データ舐めるってわけじゃないし。