[iPhone][App] KanjiName – Your Japanese Name

完全外国人向けアプリケーションをリリースしました。ユーザーの漢字名が載った和風な名札を作成、フォトライブラリの写真上に載せてオリジナルフォトを作成します。漢字には青柳衡山フォント2を使用、イラストレーションは毒乙女に作成いただきました。両氏に感謝。
アプリケーション詳細はこちら。
» KanjiName – Your Japanese Name

完全外国人向けアプリケーションをリリースしました。ユーザーの漢字名が載った和風な名札を作成、フォトライブラリの写真上に載せてオリジナルフォトを作成します。漢字には青柳衡山フォント2を使用、イラストレーションは毒乙女に作成いただきました。両氏に感謝。
アプリケーション詳細はこちら。
» KanjiName – Your Japanese Name
Eric Gamma et al. – Desingn Patternsを全部Action Scriptで解説しようと思ったらなかなかハードで途中で力尽きてしまった。一応全体三部のうちのStructural Patterns(以下参照)については完成はしていたので公開することに。ただし注意。そもそもの動機が自分のための勉強だったため、単なる書物の和訳にならないように自分で本質だと感じた部分をメインに書いている。したがって内容に少しでも疑問を持った場合は原著をあたってください。


Nespresso Stock Checkerに新機能を追加しました。GPS機能を使って最寄りのNespressoブティックを検索します。日本は17店舗あるのできっと役に立つと思います(USは7店舗)。
アプリケーション詳細はこちら。
» Nespresso Stock Checker
第8回、9回講義(2009/04/27、29、要iTunes)聴講。第8回はUITableView(+UIScrollView)について、第9回はデータの読み込み・書き込みについて幅広く紹介。
ゲストスピーカーにUITableViewの開発チームの人(Jason Beaver)を呼んでTableViewについて解説してもらっているがこれが失敗。レクチャー慣れしていならしくUITableViewについて淡々と解説していくだけで、時折ソースコードなどを交えながら解説するも、すでに自前で書き終えたソースをズラズラ見せられるだけなので何を説明したいのか伝わってこない。特に目新しいことを説明しているわけでもないので、これなら教本でじっくり理解した方が良い。(おそろしいことに第9回の解説はUITableViewをすでに理解しているという前提の上に進んでいく)
こちらのスピーカーはいつものEvan Doll。Data persistenceについて、Property listやData archivingといったCocoaでよく見るデータ読み書き方法だけでなく、SQLiteをiPhone OS内で使うところまでも実際のコードを交えて解説(むしろSQLiteメインな解説だった)。外部データを扱う場面でもJSONの解説に時間が割かれている(一瞬だがFlickrからデータを取得するデモ付き)。このiPhone appコースだが、世にある書籍に書かれていない内容を意識的に扱うようにしているように感じられとても好印象だ。
~/Library/Application Support/iPhone Simulator/ User/Applications/APP_ID/Library/Preferences/
[iPhone] HTMLリンクのようなUIButtonのサブクラスでボタンタイトルの文字列の長さに応じてアンダーラインを引く方法を試行錯誤していたが、NSStringオブジェクトのCGSizeを返すメソッドであっさり解決した。
// UIStringDrawing.h // UIKit @interface NSString(UIStringDrawing) - (CGSize)sizeWithFont:(UIFont *)font; @end
// HTMLLinkButton.m - (void)drawRect:(CGRect)rect { CGFloat w = rect.size.width; CGFloat h = rect.size.height; CGFloat capHeight = self.font.capHeight; CGFloat xHeight = self.font.xHeight; CGFloat underlineLength = [_buttonTitle length] * xHeight; CGFloat startX = (w - underlineLength) / 2.0; CGFloat startY = (h + capHeight) / 2.0; CGFloat endX = startX + underlineLength; CGFloat endY = startY; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, _colorController.currentColor.CGColor); CGContextMoveToPoint(context, startX, startY); CGContextAddLineToPoint(context, endX, endY); CGContextStrokePath(context); }
// HTMLLinkButton.m - (void)drawRect:(CGRect)rect { CGFloat w = rect.size.width; CGFloat h = rect.size.height; CGFloat titleWidth = [_buttonTitle sizeWithFont:self.font].width; CGFloat titleHeight = [_buttonTitle sizeWithFont:self.font].height; CGFloat descender = self.font.descender; CGFloat startX = (w - titleWidth) / 2.0; CGFloat startY = (h + titleHeight) / 2.0 + descender; CGFloat endX = startX + titleWidth; CGFloat endY = startY; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, _colorController.currentColor.CGColor); CGContextMoveToPoint(context, startX, startY); CGContextAddLineToPoint(context, endX, endY); CGContextStrokePath(context); }