iPhone Cookbook やネットを参考にして #123456 の RGB値からUIColor を作るのを次のようにやっています。
最初は Wall Calendar で表示しているマイカレンダーの色は Google Calendar の API が返す値を使用していたのですが、API が返す値はブラウザで見える色よりも、かなり濃い色のため結局対応表を作って、ブラウザで見る色と同じにしています。
#import <Foundation/Foundation.h> @interface UIColor (Hex) - (UIColor *) initWithHex:(NSString *)hexString alpha:(CGFloat)alpha; @end @implementation UIColor (Hex) - (UIColor *) initWithHex:(NSString *)string alpha:(CGFloat)alpha { UIColor *color = nil; if (string && [string length] == 7) { NSString *colorString = [NSString stringWithFormat: @"0x%@ 0x%@ 0x%@", [string substringWithRange:NSMakeRange(1, 2)], [string substringWithRange:NSMakeRange(3, 2)], [string substringWithRange:NSMakeRange(5, 2)]]; unsigned red, green, blue; NSScanner *scanner = [NSScanner scannerWithString:colorString]; if ([scanner scanHexInt:&red] && [scanner scanHexInt:&green] && [scanner scanHexInt:&blue]) { color = [[UIColor alloc] initWithRed:(float)red / 0xff green:(float)green / 0xff blue:(float)blue / 0xff alpha:alpha]; } } return color; }
gist にもあげてあります。
Wall Calendar という Google Calendar のスケジュールを壁紙にするアプリをリリースしました。
スケジュールを見るために毎回カレンダーを表示するのが手間だったのが解消できたのと
会社で使っている Google Apps に対応出来たのが良かったなと思ってます。
バージョンアップで次の点を修正、追加していく予定です。
画質の荒いのは手抜きして、UITableView を作って、それをスクリーンショット撮っているからです。
手抜きできる!と思ったのですが、画質が荒いという罠がありました。
まず実用度を上げてから調整していきます。
fladdictさんの記事を参考に、DSY Translationsに翻訳を頼んでみました。
英語、ドイツ語、フランス語の3つの翻訳をお願いしたところ、元々あった英語の翻訳を参考にしてもらって少し安くなり、
1言語あたり32ユーロ、英語の翻訳が無ければ、1言語あたり35ユーロだそうです。文字数は1500ぐらいでした。
文字数が多いからかもしれませんが、id:ktakayama さんの記事の金額と比べると少し高いようです。
ドイツ語、フランス語の質はわかりませんが、英語は知り合いに聞いたら「多分大丈夫」と言っていたので、多分大丈夫なんでしょう。
4営業日というスピードで返ってきていますし、値段も安く、返答してくれた人も丁寧だったので、また依頼しようとは思っています。
やっとバージョンアップ出来ました。。。全然作る時間なしでした。
新機能は ipod touch を使っている人のために、ブックマークした商品はオフラインでも見えるようにしてみました。
それとステータスバーみたいなものを付けてみました。例えばブックマーク時に画面下のタブバーの上から、
半透明のバーを出してブックマーク対象を表示、数秒後に隠れるという感じです。
ステータスバーのサンプルソースをつけておきます。
setProgress することで、プログレスバーも表示するようにしています。
#import "Statusbar.h" @implementation Statusbar @synthesize messageBar; @synthesize indicator; @synthesize messageLabel; @synthesize progressbar; #define STATUSBAR_HEIGHT 44.0 #define TABBAR_HEIGHT 49.0 - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setBackgroundColor:[UIColor clearColor]]; messageBar = [[UIToolbar alloc] init]; messageBar.barStyle = UIBarStyleBlackTranslucent; [messageBar sizeToFit]; [self addSubview:messageBar]; indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; [indicator setFrame:CGRectMake(10, (STATUSBAR_HEIGHT-20)/2, 20, 20)]; [self addSubview:indicator]; messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, (STATUSBAR_HEIGHT-14)/2, 270, 14)]; [messageLabel setBackgroundColor:[UIColor clearColor]]; messageLabel.font = [UIFont systemFontOfSize:14.0]; messageLabel.textColor = [UIColor whiteColor]; [self addSubview:messageLabel]; progressbar = [[UIProgressView alloc] initWithFrame:CGRectMake(150, (STATUSBAR_HEIGHT-10)/2, 160, 90)]; progressbar.progressViewStyle = UIProgressViewStyleBar; progressbar.hidden = YES; [self addSubview:progressbar]; openY = frame.origin.y - STATUSBAR_HEIGHT; closeY = openY + STATUSBAR_HEIGHT; } return self; } - (void)dealloc { [messageBar release]; [indicator release]; [messageLabel release]; [progressbar release]; [super dealloc]; } - (void)setMessage:(NSString *)message { messageLabel.text = message; } - (void)setProgress:(float)value { progressbar.hidden = NO; [progressbar setProgress:value]; messageLabel.frame = CGRectMake(40, (STATUSBAR_HEIGHT-14)/2, 110, 14); } - (void)open { CGContextRef context = UIGraphicsGetCurrentContext(); [UIView beginAnimations:nil context:context]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.3]; CGRect rect = [self frame]; rect.origin.y = openY; [self setFrame:rect]; [UIView commitAnimations]; [indicator startAnimating]; } - (void)close { CGContextRef context = UIGraphicsGetCurrentContext(); [UIView beginAnimations:nil context:context]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.3]; CGRect rect = [self frame]; rect.origin.y = closeY; [self setFrame:rect]; [UIView commitAnimations]; [indicator stopAnimating]; progressbar.hidden = YES; } @end
次のように使います。
[statusbar open]; [statusbar setMessage:[NSString stringWithFormat:@"%@... %@", NSLocalizedString(@"Bookmark", nil), title]]; [statusbar close];
最初に申請した時に、左の画像の右上にあるようなアイコンを使っていました。
これが Human Interface Guidelineに沿っていないということでリジェクトされたようです。
特に一番右のボタンは Action というもので、押すと Action Sheet で選択を促すような作りにする必要があるようです。(詳しくは iPhone Human Interface Guidelines の Standard Buttons for Use in Toolbars and Navigation Bars を参照してください)
アプリ毎に違った使われ方をするとユーザが混乱するというためですね。
システムで用意されているボタンを使う時はご注意ください。
現在は右の画像のような作りになっています。
アイコンの使い方がまずく一度リジェクトされましたが、修正して無事通ったようです。
12/8 に最初に申請しましたので、10日で受理されました。
ただ申請し直したのに画像が少し古いようです。
お気に入りの機能は各国アマゾンの商品を同じブックマークに入れておけることです。
下の画像だと、amazon.co.uk, amazon.fr, amazon.de, amazon.co.jp の商品が入ってます。
他には ISBN での検索なんかも出来ます。
普通にタイトルで検索した方が早いので使いませんが、
タイトルで見つからなかった時とかはいいかもしれませんね。
UI でどうしてもわかりにくいのが検索のカテゴリ選択。
検索フォームの左に付いてる青い検索マークがボタンになってます。
ここをもう少しわかりやすく出来るといいんですが、良い案が思いつかず。
最初のバージョンで基本的な機能の実装が終わりましたので、
ここから独自の機能を追加していく予定です。
僕は、日本語が800文字くらいでした。
今度ドイツ語とフランス語の訳を調べてみようと思ってます。