プログラマメモ2 - programmer no memo2

目次

バージョンの確認はしっかりと... - ios app 2013/09/07
2013/09/07


先月リリースした「ブルカウンター」ですが、有料でだしたのですが、作った人としては、残念なことに、一本もダウンロードされず、仕方がないので、無料にしたら、スポーツの無料で50位内に瞬間はいったのでした。

こんなアプリです。


で、ダウンロードされて、一件だけついたコメントが、落ちるということでした。


たしかにxcodeの設定ではターゲットが5.1なのですが、テストした環境の実機はios6でして、シュミレータもios6でしかやってませんでした。

というわけで、申し訳ございませんでした。

早速、シュミレータに5のバーションをインストール。
参考にした記事は以下

iosシミュレータのバージョンが6.0しかないときに前のバージョンを使いたくなったら | 日記の間 | あかつきのお宿


つぎに、シュミレーターで、動かしてみました。動かすと、ものの見事におちました。
おちた原因は2つ。

1つは、ios6から入っている、UITableのregisterClassを使っていた箇所でおちました。
ここは、

この部分は、下記のような感じで対応

#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IOS_VERSION >= 6.0) {
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    }
}
とりあえず。

で、つぎの落ちた箇所の、エラーが下記。

'NSInternalInconsistencyException', reason: 'The NIB data is invalid.'
このエラーをみたとき、調査するの大変かもとびびりましたが、下記の記事にヒットして、すぐに解決できました。

EZ-NET: Autorayout のセルを iOS 5 で読み込むとエラーになる


ios6の目玉機能、autolayoutを使うという設定をしてたからでした。
※アプリでは、この機能使ってないんですが。。。

いろいろありましたが、落ちる部分だけ、さきに直して、申請しようと思います。
レビューのコメントに感謝です。





刻印文字っぽいのその1 2011/10/18

刻印文字っぽいのにチャレンジ


CGContextSetShadowWithColorをいろいろ駆使するとコーディングでいろいろ表現できる。
CSS3?のtext-shadow?で表現していることを参考にしています。
- (void)drawRect:(CGRect)rect { NSLog(@"*** override drawRect!!"); // コンテキストをゲット CGContextRef context = UIGraphicsGetCurrentContext(); { /* * グラデーション */ // コンテクスト保存 CGContextSaveGState(context); if(TRUE){// CGGradientを生成する CGGradientRef gradient; CGColorSpaceRef colorSpace; size_t num_locations = 2; CGFloat locations[2] = { 0.0, 1.0 }; // FFA500 FF4500 CGFloat components[8] = { 0xFF/255., 0xA5/255., 0x00/255., 1.0, // Start color 0xFF/255., 0x45/255., 0x00/255., 1.0 }; // End color colorSpace = CGColorSpaceCreateDeviceRGB(); gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, num_locations); CGPoint startPoint = CGPointMake(self.frame.size.width/2, 0.0); CGPoint endPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); // GradientとColorSpaceを開放する CGColorSpaceRelease(colorSpace); CGGradientRelease(gradient); } // コンテクスト復元 CGContextRestoreGState(context); } { /* * 文字列を描画して影付けしている * */ // コンテクスト保存 CGContextSaveGState(context); UIColor *color1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2]; UIColor *color2 = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.8]; CGContextSetShadowWithColor(context, CGSizeMake(-1.0f, 1.0f), 0.0f, [color1 CGColor]); CGContextSetShadowWithColor(context, CGSizeMake(1.0f, 1.0f), 0.0f, [color2 CGColor]); CGContextSetRGBFillColor (context, 0, 0, 0, 1); // UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:40]; NSString *str = @"HelooWorkd"; [str drawAtPoint:CGPointMake(10, 10) withFont:font]; // コンテクスト復元 CGContextRestoreGState(context); } }

デバイスの向きがかわって回転させないようにしたい 2011/10/15
2011/10/23

iosです。
デバイスの向きがかわって回転させないようにしたいです。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return false; }

すぐ忘れてしまうんですよね...
2011/10/23 追記

上記のコードだと、「It should support at least one orientation.」と警告ログがでる。
iphone - Ipad device orientation problem - Stack Overflow
方向を固定させたい向きかどうかで判定させるのがいいのかも。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); }

cocos2dがRetinaDisplay(HighRez)対応していた 2010/10/11

cocos2dです。cocos2dがリティナに対応しているようなので、つくりかけのものに適応しはじめているところです。
現時点でのバージョンは、v0.99.5-beta3 です。



ポイント、ピクセルという概念で値を設定していくようです。
ポイントベースの場合は、480×320で設定できるので、960×640を意識せず、High Rezではないiphone/ipod touchに対応できます。値をかえずよいということのですね。

Device Points Pixels
iPhone 3GS or older 480×320 480×320
iPhone4 in LowRes mode 480×320 480×320
iPhone4 in HighRes mode 480×320 960×640
iPad 1024×768 1024×768
Mac W x H W x H
Point vs. Pixel


ピクセルベースでつくっていたので、いろいろ面倒なことになってしまってます...
Orz...

自分メモ
ディレクターにrunWithSceneを設定する順番で、みためが変わってしまう(High Resではないということ)ようなので、順番を注意する必要があります。
applicationDidFinishLaunchingで、RetinaDisplay mode オンリーの場合
{
/*
!!ここでrunWithSceneしてはだめ!!
[[CCDirector sharedDirector] runWithScene: [HelloWorld scene]];
*/


// Add this code in your Application Delegate, right after initializing the director

// Director Initialization
[director setOpenGLView:view];

// Enables High Res mode on iPhone 4 and maintains low res on all other devices
// Don't add if you don't want to enable HighRes mode on iPhone4
if ([UIScreen instancesRespondToSelector:@selector(scale)])
[director setContentScaleFactor:[[UIScreen mainScreen] scale]];

/*
ここでrunWithScene!!
*/
[[CCDirector sharedDirector] runWithScene: [HelloWorld scene]];
}

CFAttributedStringSetAttributeで、フォントを変更、アラインの変更などなど 2010/09/03

CGContextRefにいろいろ描画していて、さらに文字列を表示しようとしていろいろ四苦八苦。
表示する分には簡単に調べてできたけど、中央に表示したいと思い、やりはじめるといろいろはまったのでした。
とりあえず、iphone sdk4.0がターゲットです。

(1)iphoneだと、文字がひっくりかえるの防ぐ


CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, transform);


(2)フォントを変更。
※CTFontCreateWithNameって、フォントによっては時間がかかってるようにみえた.....

CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), 48., NULL);// これでも日本語okだった.....
CFAttributedStringSetAttribute(attrString, CFRangeMake(0,[str length]), kCTFontAttributeName, font);
CFRelease(font);


(3)真ん中にそろえる

CTTextAlignment alignment = kCTCenterTextAlignment;// kCTJustifiedTextAlignment
CTParagraphStyleSetting _settings[] = { {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment} };
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(_settings, sizeof(_settings) / sizeof(_settings[0]));

CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTParagraphStyleAttributeName, paragraphStyle);
CFRelease(paragraphStyle);


特に、このサイトの記事によるものです。

ここのスライドショー


参考


コード自分用
{ // このコードがないとひっくりかえるよ
CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, transform);
}

CGMutablePathRef path = CGPathCreateMutable();
CGRect bounds = CGRectMake(0.0, 10.0, 320, 200.0);
CGPathAddRect(path, NULL, bounds);
CFStringRef string = (CFStringRef)str;// CFSTR("test");
CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), string);

{ // フォントを変更
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), 48., NULL);// これでも日本語okだった.....
CFAttributedStringSetAttribute(attrString, CFRangeMake(0,[str length]), kCTFontAttributeName, font);
CFRelease(font);
}


{ // アラインを変更
CTTextAlignment alignment = kCTCenterTextAlignment;// kCTJustifiedTextAlignment
CTParagraphStyleSetting _settings[] = { {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment} };
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(_settings, sizeof(_settings) / sizeof(_settings[0]));

CFAttributedStringSetAttribute(attrString, CFRangeMake(0, CFAttributedStringGetLength(attrString)), kCTParagraphStyleAttributeName, paragraphStyle);
CFRelease(paragraphStyle);
}

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0), path, NULL);

CFRelease(attrString);
CFRelease(framesetter);
CTFrameDraw(frame, context);
CFRelease(frame);

cocos2dではNSTimerは使わない。 2010/08/23

cocos2dです。

スケジュールさせた時間にスプライトを動かすのどうするんだろうーということで。



いきなりNSTimerを使うコメントの評価が -8になっていました(現時点)。
なるほどcocos2dでは使ってはいけないのだなーと。

スケージュール実行はcocos2d frameworkが用意してくれてる仕組みを利用します。

スケジュールはinitで
// schedule timer
[self schedule: @selector(ticktack:)];
[self schedule: @selector(ticktack2:) interval:0.5];


で感じで定義して、
したのような関数をよういすれば、定期的によばれます。

-(void) ticktack: (ccTime) dt
{

}

rejectされた理由 2010/07/21

iphone appのレビューでrejectされてしまったのは、MKMapViewの使い方の問題だったわけですが、viewのサイズを大きくしてツールバーでgoogleさんのブランディングのロゴが消えてしまったのがいけなかったわけです。左すみにあるあのロゴです。
map使う人は注意しないといけませんね。



気がつかなかった。

UITouchのhash 2010/07/19

ccTouchesBeganからはじまって、ccTouchesMovedで動きを捕捉する際に、どうやったら最初にタッチしてから動かし続けている値なのかとわかるのかなーと考えていたわけですが、UITouchにはるhashが一貫して変化しないようなので、hashを保持してれば、問題なさそうだと。

NSUInteger touchHash = [touch hash];
GTekna Corp. » Track the same UITouch Object


あと、(NSSet*)touchesで受けたら、for (UITouch *touch in touches) でぐるぐるまわして使う。

次はタッチしたらそのスプライトの画像を変化させたいなと。

cocos2dです。タッチして表示したオブジェクトを動かすというコードを試している最中です。 2010/07/18
2010/07/19

cocos2dです。タッチして表示したオブジェクトを動かすというコードを試している最中です。
cocos2dはゲーム向けのフレームワークです。おそらく僕が生のcocoa touchを使ってコードを書いていくよりずいぶん楽ができるだろうと期待してます....


さて、画面に何やら表示するさいにはCCSpriteというのを使うようです。
で、それを画面でタッチして動かしたいわけなので、イベントをひろう方法は、えーと、
イベントをひろうのは下記
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;


で、ccTouchesBeganで、タッチした位置がスプライトと重なっているか判定したい。


BOOL isOk = NO;
-(void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{

UITouch *touch =[touches anyObject];
CGPoint location =[touch locationInView:[touch view]];
location =[[CCDirector sharedDirector] convertToGL:location];
int offX = location.x;
int offY = location.y;

NSLog(@"%d %d", offX, offY);

CGRect スプライトRect = [self rectForSprite:スプライト];
if(CGRectContainsPoint(スプライトRect, location)) {
isOk = YES;
} else {
isOk = NO;
}
}


で、中で使われているrectForSpriteの実装は下記。
このメソッドは、Cocos2d: Trials and Tribulationsで紹介されていたものです。

-(CGRect)rectForSprite:(CCSprite *)sprite{

float h = [sprite contentSize].height;
float w = [sprite contentSize].width;
float x = sprite.position.x - w/2;
float y = sprite.position.y - h/2;

CGRect rect = CGRectMake(x,y,w,h);

return rect;
}


なんとかできてる気がするが...

UITableViewControllerを使わないなら、didSelectRowAtIndexPathで、deselectRowAtIndexPathをしないとだめよ。 2010/07/12

「そうは問屋が卸さない」って感じです。
iphoneアプリです。先日、iAdを取り込んで審査にだしましたが、また途中で、問題あることに気がついて、developer rejectしました。
今回の理由は、UITableViewControllerを使用しない方法をとったがため、セルを一度選択したら、その選択をはずすというコードがぬけてしまったことです。

あらためて、コードを追加。


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[self.tableView deselectRowAtIndexPath:indexPath animated:YES];

}


で、何故気がついたかというと電車の中で、ぱらぱらと、

iPhoneSDK開発のレシピ
高山 恭介 広部 一弥 松浦 晃洋
4798025798


を眺めていたら、レシピ052に、自前で解除しないと審査でリジェクトされると書いてあってまさかねーと思ったら案の定、解除していなかったわけです。

3度目の正直といきたいところです。

iAdをとりこんでみる練習 2010/07/11

テーブルリストがあるViewの一番下にiAdをおきたいなーと試行錯誤してます。
XIBを使用しないで、UITableViewControllerを使っていたのと、cocoaの仕組みを理解してないところが災いして手間取ってます。

まあ、この方法でいけるかなというところでメモ。

UITableViewController をUIViewController<uitableviewdelegate,uitableviewdatasource>にしちゃう。
UITableViewをインスタンス変数にしてしまう。
initでUIViewをつくって、self.viewに入れる。
delegateにしたので、self.tableView.delegate = self;self.tableView.dataSource = self;
しておく。
self.viewにtableViewとiAdのバナーを位置決めしてaddSubViewしてしまう。
deallocで値の解放を忘れずに。


ぐだぐだ悩むより[WWDC 2010 Session Videos - Session 112 - Integrating Ads with iAd]みるのが一番!!

AJAX Search API をYAJLで使ってみます。 2010/06/07


アプリ経由でgoogleさんの検索結果が欲しいなと思いました。
JSONで取得することにして、簡単だー、と思っていたら、Objective-CでどうJSONって扱うのだろうというところでとまどいました。


こちらの記事を読んでYAJLを使ってみることに決定。

使用しているライブラリは、

ここまではいいのですが、Objctive-Cをよく理解できていない僕は、悩むわけでした。

なんとか、必要な情報をとるためのコードをこさえました。
参考

yajl-objcをとりこんだあとは、
これを忘れずに、
#import "YAJL.h"


Objective-Cってなかなか柔軟であることに気がつきました。
(いまさらですが...)

YAJLDocumentベースで作成してます。

コード
NSString *urlString = @"http://ajax.googleapis.com/ajax/services/search/web?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%A1%E3%83%A22&v=1.0&rsz=large&hl=ja";

NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];

NSError *error = nil;
YAJLDocument *document = [[YAJLDocument alloc] initWithData:data parserOptions:YAJLDecoderCurrentTypeDict error:&error];

NSLog(@"Root: %@", document.root);
NSLog(@"==================================");
NSLog(@"responseStatus==>[%@]", [document.root objectForKey:@"responseStatus"]);// ステータス200ならOK
id cursor = [[document.root objectForKey:@"responseData"] objectForKey:@"cursor"];// カーソル
{
NSLog(@"型を調べてみると==>[%@]", [cursor class]);
for (id o in cursor) {
NSLog(@" 型==>%@", [o class]);
}
}
id results = [[document.root objectForKey:@"responseData"] objectForKey:@"results"];// 検索結果

NSLog(@"型を調べてみると==>[%@]", [results class]);
for (id o in results ) {
NSLog(@" 型==>%@", [o class]);
NSLog(@" %@", [o objectForKey:@"cacheUrl"]);
NSLog(@" %@", [o objectForKey:@"content"]);
NSLog(@" %@", [o objectForKey:@"titleNoFormatting"]);
NSLog(@" %@", [o objectForKey:@"url"]);
}
[document release];


あとは型でチェックするコードを追加すればまあまあいけるかな。どうでしょうか。

xcodeプロジェクトのテンプレートを用意する 2010/05/26

xcodeです。

参考リンクだけおいてもよかったけど、僕にとって今後重要そうなtipsなのでメモしておきます。

基本方針としてiphone,ipod,ipadの開発にはIB(InterfaceBuilder)使わないことにしたので、Xcodeのプロジェクトのテンプレートをxibなしにして用意していきます。



上記のサイトを参考(すごくまとまってます.gitignoreまで用意してます!!)

で、Xcodeは新規プロジェクトを作成する際のテンプレートを用意してくれてます。それをカスタマイズして追加していきます。
Window-based Applicationをターゲットにして作業していきます。

まず、テンプレートの位置

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application/Window-based Application


中身はこんな感じ
これらがテンプレートプロジェクトになります。

$ ls
TemplateChooser.plist
Window-based Universal Application
Window-based Universal Core Data Application
Window-based iPad Application
Window-based iPad Core Data Application
Window-based iPhone Application
Window-based iPhone Core Data Application
Window-based-non-IB-iPhone Application


色がついたところは僕が追加しました。

(1)
「Window-based iPhone Application」をコピーして、「Window-based-non-IB-iPhone Application」を作成

「Window-based-non-IB-iPhone Application」にあるファイルをひとつづ編集していきます。
(2)
「main.m」のUIApplicationMainの4番目の引数を@"___PROJECTNAME___AppDelegate"にします。

(3)
「___PROJECTNAMEASIDENTIFIER___-Info.plist」
xib使ってる項目を削除

<key>NSMainNibFile</key>
<string>MainWindow</string>


(4)
MainWindow.xibファイルをばっさり削除

(5)次が面倒だけど、___PROJECTNAME___.xcodeprojの中にあるproject.pbxprojファイルの中から、MainWindow.xibと記述されている行を削除していきます。結構あります....

(6)最後に、/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application/Window-based Application直下にあるTemplateChooser.plistを編集します。
ここに追加されてはじめてXcodeはテンプレートを選択肢にあげてくれます。
TemplateChooser.plistをみると追加するところはすぐにわかります。

で、結果どうなるかといいますと、

新規プロジェクトでテンプレートを選択できます。


今後は、ボタンをのっけたテンプレートを用意したりして、トライアンドエラーを繰り返せる環境を用意しようかなと。

何度も同じ作業しないためにも!!テンプレート重要!!

ほんと、反省してるのは、現在進行中のプロジェクト上で、プログラミング検証用のコードとか、振る舞いをコードをいろいろ書いてコメントアウトしたりしてトライアンドエラーしてること。

お試し用のプロジェクトと本番プロジェクトをきっちりわけておきたいところ。

クラッシュクラッシュクラッシュ レイヤーからアニメショーンをとりのぞけ - MKMapViewがらみ 2010/05/22

自分自身でおきている問題が100%そうなのかというとまったくもって自信はないが、クラッシュしずらくなった感じがするので、メモります。

ことのはじまりは、
どうも、
プログラマメモ2: [はしり書き]MKMapViewのアノテーションのピン画像を変更
このあとから、シュミレータで突然おちることがおおくて、まれに実機でもおちるようになりました。




半分あきらめかけていたのですが、上記の記事でなるほどと思い、まず、ユーザーロケーションを使わなくしたら落ちなくなりました。
mapView.showsUserLocation = NO;

ようはアニメーションしている間に、画面オブジェクトが破棄されようとすると起きる事象のようですね。
で、ユーザロケーションをしめす動作でいろいろアニメーションしているから、問題がおきるというわけ。
(※この辺は、どう実験していいのかわかってないので僕自身100%保証できないけど)

この件に関しての具体的な解決方法は、下記のページを参考にしました。

ベストな解決方法は、
viewWillDisappearでmapViewのレイヤーアニメーションをとりのぞくということを行う。
アニメーションを使う際の、必須コードなのかもしれない...
コードは、
- (void)viewWillDisappear:(BOOL)animated {
[mapView.layer removeAllAnimations];
}


そういえば先月,
Core Animationの本買ったんだった自分
Orz...

追記:改善できたと思ったけど、なんかだめ....
どうしてだろう、とりあえずこんなコードをためしてみてます。
- (void)viewWillDisappear:(BOOL)animated {
mapView.showsUserLocation=NO;
[mapView.layer removeAllAnimations];
}


なんかもうだめだ...

追記:ではこれでどうだろう。delegateしているので、
- (void)viewWillDisappear:(BOOL)animated {
mapView.showsUserLocation=NO;
mapView.delegate=nil;
[mapView.layer removeAllAnimations];
}


参考

さあ、どうだ、これでどうだ
Orz...

[はしり書き]MKMapViewのアノテーションのピン画像を変更 2010/05/15
2010/05/15

はしり書きメモです。
iphoneです。MKMapViewのアノテーションのピンをオリジナル画像に変更してみます。
なんかこみいっててよく理解しきれていないのですが。

まずはインターフェイスから。デリゲートを使います。


@interface MapViewController : UIViewController<MKMapViewDelegate> {
MKMapView* mapView;
}

で、実装部分で、MKMapViewを生成するときに、デリゲートで自分自身を渡して、
// delegate
mapView.delegate = self;


で、addAnnotationするときに、実際のところviewForAnnotationがよばれてMKAnnotationViewが返される(返す)。
で、viewForAnnotationを実装してあげます。
ここで、いろいろ切り分けて画像を指定できる感じかな。

実装部分はここを参考
[iPhone] MapKit にアイコン画像でピンを立ててタップ可能にする | Sun Limited Mt.


-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

MKAnnotationView *annotationView;
NSString* identifier = @"Pin";
annotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if(nil == annotationView) {
annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
}
annotationView.image = [UIImage imageNamed:@"my_pin.png"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
annotationView.annotation = annotation;

return annotationView;
}


うーん、いまいちこれでいいのか不安になってきた...

<ため息>
コードはなんとなくできたのだけども、問題は自分でつくった画像がマップとそぐわない。
デフォルトのピンの画像みるとしっかり影もハイライトもついている。。。。
</ため息>
参考
iPhone - Annotation image disappears on touch - Stack Overflow
iPhoneのGPSとMapKitを使った地図を連動させる方法 - iPhoneSDK他いろいろ 開発メモ
iPhone Mapkitの使い方

[宣伝]TokyoJinjya 0.1 - iPhoneアプリを公開しました。 2010/04/25

宣伝です。iPhoneアプリを公開しました。




インフォメーションのアイコンで一部素材を使わせてもらってます。
この場をかりて、お礼もうしあげます。


とてもお世話になった本

この本があったおかげでつくってみようという気になれました。かなり参考にさせてもらってます。
iPhoneアプリネットワーク+GPSプログラミング
4798024244


画面遷移(ナビゲーション)の部分でお世話になりました。
iPhoneプログラミングUIKit詳解リファレンス
京セラコミュニケーションシステム株式会社
4897978440


これから実装しようと思ってるページカール(PageCurl)の実装等
iPhoneSDK開発のレシピ
4798025798


レファレンスとしてパラパラめくりました。
Objective-C逆引きハンドブック
4863540515

とりあえず必要なiPhone向けアイコンは57x57pxのPNG 2010/04/11
2010/04/12

調べればすぐに調べられるけど、とりあえずメモ。

iphone向けアイコンは57x57pxPNG。
アプリケーションを起動した瞬間一瞬真っ黒になるけど、そこに指定した画像を表示できる。
スプラッシュウィンドウのかわり!?になるのかな。で、この指定する画像サイズは、縦が(480-20)=460px、横が320px
えーとなので320x460pxのpng

2010-04-13 追記
わざわざ縦のサイズ気にする必要ないかもしれない.....


参考
sonson@Picture&Software - [iPhone] 画面サイズ

で、iPhone Human Interface GuidelinesをながめてるとLaunch Imagesというようですね。

[cocoatouch]自動伸縮するスペースを置いてそのあとに置いたボタンを右よせにする。 2010/04/07

cocoatouchです。
ツールバーとかでボタンの右寄せどうするのかなーというわけで、ボタンとボタンの間にスペースを置いて解決。

遅々としてすまない進捗状態ですが、こつこつと。

/**
ボタンを右よせしたいときにつかう。
*/
+(UIBarButtonItem*) createSpacer {

UIBarButtonItem* spacer =
[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil ] autorelease];
return spacer;
}



ネタもとは、

iPhoneプログラミングUIKit詳解リファレンス
京セラコミュニケーションシステム株式会社
4897978440

ツールバーにのっけたいときは、UISegmentedControlはUIBarButtonItemにして使う。 2010/04/06

ihponeです。cocoatouchです。いまいち、わかってない感がありますが、とりあえずメモ。
ツールバーにUISegmentedControlをのせたいときは、えーと、UIBarButtonItemにして、それをのせるって感じですかね。

+(UIBarButtonItem*)createSegmentedButton: (NSArray*)titles target:(id)target selector:(SEL)selector {

UISegmentedControl* segment = [[[UISegmentedControl alloc] initWithItems:titles]autorelease];
// この設定で状態を残さない
segment.momentary = YES;
segment.frame = CGRectMake(0, 0, 100, 30);

[segment addTarget:target action:selector forControlEvents:UIControlEventValueChanged];
UIBarButtonItem* button = [[[UIBarButtonItem alloc]initWithCustomView:segment]autorelease];
return button;

}

ナビゲーションのツールバーの可視状態のコントロールにviewWillAppearを使うのはどうだろう。 2010/04/04

iphone(ipod touch)です。cocoatouchです。
画面遷移にUINavigationControllerを使っていて、ある画面にはツールバーをだしたいなとのコントロールをどうしようかと悩んでます。で、遷移した画面で発生するイベントで呼ばれるviewWillAppearをオーバライドして、ツールバーをみせたりかくしたりするようにしてみました。

以下コード。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.toolbarHidden = YES;// ツールバー表示する場合はNO
}


とりあえずこのコードで目的は達成できそうです。

参考
UIViewの-viewWillAppear:はsuperの呼び出しを忘れずに - リンゴの水やり?(はてな)


iPhoneプログラミングUIKit詳解リファレンス
京セラコミュニケーションシステム株式会社
4897978440