頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


隙間時間に図書館で借りた本を読む

最近いわゆる隙間時間に本(電子書籍ではない)を読むようにしています。
自分の場合、歯を磨いている時とかちょっとした待ち時間とか。
その程度でも案外読めるもので、2週間あれば1冊読めるくらい。

それ以前はたいていiPhoneをいじっていました。いくらでも時間つぶせますもんね。
でもあまりiPhoneばかりやってるとアホになるな、と心を改めまして。

で、以前買ってほったらかしだった本をどんどん消化してきたのですが、先日「菜の花の沖」の3巻を読み終え、次を買おうとしたのですが、ふと
600円ちょいする文庫本を節約すればミスドでドーナッツが6個食べられるやん!
なんて考えが頭をよぎり、4巻から図書館で借りるようになりました。
ちなみに図書館の貸し出し期限は2週間(まあ延長もできるけど)なので、ちょうどいいペースかも。

図書館に行くのに運動にもなるし、お金は節約できるし、iPhoneで無駄にゲームに時間を費やすこともなくなっていいことばっかり。いやホント、これ習慣にしたいわ。
スポンサーサイト






配列にaddするならnilじゃなくて[NSNull null]

配列(NSMutableArray)にnilを追加しようとして落ちる、というのを時々やってしまいます。
そんな間抜けなことしねーよって方は以下は読まなくても大丈夫です、はい。

試しに、これを実行すると落ちます:
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
[array addObject:@"iPhone 4"];
[array addObject:nil];
[array addObject:@"iPhone 4S"];

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

↑「nil追加してんじゃねーぞ、ゴラァ!」ってエラーメッセージが出ますので気付きやすいといえば気付きやすいのですがね。

コード上どうしても配列にカラ要素を入れたい!って時にはどうすればいいんだろ?
今まではその場しのぎで(?)文字列型なら@"nil"などの適当な文字列を入れたり、NSDate型なら[NSDate distantFuture]を入れてみたり。

これでもいいんだろうけど、いざ配列の中身をみていろんな処理をする場合に、その要素がnilに相当するかどうかをチェックするには、代わりに何を入れたか知っておかないとダメなので面倒。型によっても評価方法変わるし。
//(1) NSString型の場合
if ([[array objectAtIndex:ii] isEqualToString:@"nil"]) {
	//
}

//(2) NSDate型の場合
if ([[array objectAtIndex:ii] isEqualToDate:[NSDate distantFuture]]) {
	//            
}


ところが、、、[NSNull null]なんてのがあるのをつい先日知りました。 これは配列に追加することができますから次のように書いても落ちません。
[array addObject:[NSNull null]];//問題なし!

中身があるなしをif文で判定しようと次のようなコードを書いてみると、、、
if ([array objectAtIndex:ii]) {//間違い
	//
}
↑このif文は中身がカラ([NSNull null])でも常に真と評価するので、意図しないことに。

if ([array objectAtIndex:ii] == [NSNull null]) {
	//
}
↑このように == (もしくは != )で評価するとカラ要素かどうか判定することができます。

というわけで、配列にカラ要素を追加する時には[NSNull null]を使う!と決めうちしておくと何かとラクチンかも。


コードで画像を影付き角丸にする

アプリ内に表示する画像を角丸にして影を付けたいのですが、ツールを使って角丸の画像を作成するのは面倒だし、マスクの画像を準備するのもやっぱり面倒。
ってことで、コードでやってみました。

元の画像
↑元の画像はこんなの。

コードはこんな感じに:
UIImage *image = [UIImage imageNamed:@"icon.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(xx, yy , image.size.width,image.size.height);
    
//影用のview
UIView *shadow = [[UIView alloc] initWithFrame:imageView.frame];
shadow.backgroundColor = [UIColor grayColor];
shadow.layer.shadowOpacity = 0.3f;
shadow.layer.shadowOffset = CGSizeMake(0, 2);
shadow.layer.cornerRadius = 10.f;
[self.view addSubview:shadow];
[shadow release];

[self.view addSubview:imageView];
imageView.layer.cornerRadius = 10.f;//角丸用
imageView.layer.masksToBounds = YES;//角丸用
[imageView release];
影を描くためにshadowってUIViewクラスのオブジェクトを用意し、画像の下側に置いてます(よって"影用のview"の部分が割り込んでる、読みにくくてすまん)。
単に角丸だけならこの部分は不要でcornerRadiusとmasksToBoundsを設定するだけでOK。

角丸+影付きの画像
↑こちらが結果の画像。
これで、角丸画像をツールで作らずに済むわ。


もしかしてええんちゃうの?iOS 5.0.1

やっとこさ昨日、iOS 5.0.1にアップデートできました。

iPhone 3GSにはiOS 5.0.1 beta 2を入れてたため、設定でチェックするとOSは最新ですって出るのでOTAではなく、iTunes(10.5.1 beta 2)経由でアップデート。

iPod touch (4G)はiOS 5.0が入っていたのですが、元は開発者用のGMだったので、OTAできないのかな?と最初は思っていたのですが、単に混雑してただけのようで、昨日にはOTAでアップデート完了しました。

バッテリーうんぬんというのはよくわからないのですが、なんとなく全般的に普通に動くようになった気がします。
あくまで現在のところですが、入力時のもたつきや画面スクロール時のひっかかりが激減して、5未満の時に戻った感じです。
touchはホームボタンを2回押さないと起動しなかったのも直ったようだし。

期待していた日本語キーボードがらみの小さい不具合は改善されていませんでしたが。


「赤ちゃんの成長グラフ」アプリ ver1.3リリース

今週月曜日にアップデートの申請していた「赤ちゃんの成長グラフ」アプリの審査が今朝通過してました。

今回のアップデートではグラフを拡大すると、個々の点の入力値を表示し、該当する入力表へジャンプできるボタンを設置しました。

グラフを拡大すると表示されるジャンプボタン
↑グラフを拡大すると、画面中央に一番近い点の内容とジャンプボタンが表示されます。

赤ちゃんの成長グラフの入力表
↑ボタンを押すと入力タブに移動し、該当する日付にマークが付きます。


その他の変更点だと、ナビゲーションバーの色をデフォルトから少し変え、それに合うようにステータスバーを黒にしました(気付かれないかもしれないけど)。

また、設定タブがごちゃついてきそうなので、ヘルプタブを追加しました。
表示する内容は変わっていませんが。

あと、内部的なこと(見た目はわからない)ですが、不具合を修正しました。
実は今までメモリ不足の時に落ちていました。
メモリ不足警告時に、隠れたビューが消されるので再描画できるようにすべし、って例のやつです。
新規リリース前にチェックしていたので、レビューで「落ちる!」と言われても半信半疑でもありました。
ところが、試してみると確かに落ちるのがいとも簡単に再現しまして。
ホント、何やってたんでしょうね?
ともかく、今回修正したのでレビューで「落ちる!」ってのがなくなるのに期待です。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.