2010年12月17日金曜日

下にスクロールしたら更新ができるアレ

iPhoneアプリで下にググーっとスクロールすると更新が出来るUIありますよね。


これこれ。Twitterの公式アプリにも実装されています。

このUIあんまり好きじゃなかったんですけど、GoogleのアプリでもこのUIが採用されたっぽいし、
標準UIになっていくのかなぁー 実装してみるかなぁー とググっていたのですが...

キーワードが分からない!

なんとかたどり着いたキーワードは

pull to refresh

でした。

Pull かー。なるほどなー。
swipe down とかかな?と思って入れてたのですが、確かに Pull ですね、なんだか凄く納得。

MailアプリをこのUIにする 「Pull To Refresh for Mail」というアプリがあるらしい。
https://github.com/leah/PullToRefresh ここにサンプルコードがあるみたいなので、これを参考に作ってみますー。
• • •

2010年12月13日月曜日

パスワード管理ソフトCIPHERリニューアルしました


以前作成していた、パスワード管理ソフト CIPHER を移行しました。

ダウンロードできるサイトはこちらになります。 aqubi products / cipher
リニューアルしたので、以前のアプリを入れてた場合には一度アンインストールしてから入れて下さい。
DBファイルを同じにすればデータは引き継ぎできます。
ソースの管理もassemblaからbacklogに変えていますので、ソースの参照ができなくなりました。

ちなみに、このソフトの特徴は

マルチプラットフォーム


AdobeAIRで作成されていますので、Windows,Mac,Linuxで使用が可能です。

保存データの持ち運びが可能


保存されたデータは暗号化DBファイル(SQLite)として保存されます。
パスワードはOSに保存され、DBとは別管理になりますので、DBファイルだけ漏れても中身を開くことは出来ません。そのため、複数のPCより同じデータを共有したい場合、USBメモリや、Dropboxなどで同期した共有フォルダにDBファイルを置くことも可能です(最終的には自己責任でおねがいします)

です。
メモが書ける所も大きな領域で用意しているので、パスワードに限らず、漏れたくないメモを入れておくのもよいかも?

よければお使いくださいー

#あとは、ASlimTimerも同じように移行する予定です。
• • •

2010年12月6日月曜日

iPhoneアプリ開発-邪魔にならないメッセージウィンドウ

loadingのぐるぐるイメージを標準で表示できることを最近知って衝撃を受けているaqubiです。こんばんは。

YES/NOダイアログを表示するほどでもないけど、メッセージを通知したい...ということで、
下や上から、にょきにょきっ と表示されるUIViewを作成してみました。



下の方にある [network not connection]って表示されている所です。
下からにょきにょきっと出てきて、数秒後にするするっと下に下がって消えていきます。

イメージのように角丸にしたくて検索していたのですが、よく引っかかる

view.layer.cornerRadius = 5;

という方法が最新のSDKではできないんですかねぇ?
結局ごりごり書いてます。

UIViewのアニメーションは beginAnimations, commitAnimations + 最初と最後の値を指定 すれば、途中の状態は勝手に補完してくれるんすね。エライ。

MessageBoard.h



//
// MessageBoard.h
// CrossBacklog
//
// Created by aqubi on 10/12/05.
// Copyright 2010 aqubi. All rights reserved.
//
typedef enum {
MessageBoardTop,
MessageBoardBottom
} MessageBoardPosition;

@interface MessageBoard : UIView {
UILabel *label;
UIView *parentView;
MessageBoardPosition position;
}

@property (nonatomic, retain) UILabel *label;
@property (nonatomic, assign) MessageBoardPosition position;

+ (MessageBoard *)showMessageBoard:(UIView *)view message:(NSString *) message;
- (void)fillRoundedRect:(CGRect)rect inContext:(CGContextRef)context;
@end


MessageBoard.m



//
// MessageBoard.m
// CrossBacklog
//
// Created by aqubi on 10/12/05.
// Copyright 2010 aqubi. All rights reserved.
//

#import "MessageBoard.h"

@implementation MessageBoard
@synthesize label;
@synthesize position;

int height = 26;
float backgroundAlpha = 0.75f;
float radius = 10.0f;

- (id)initWithView:(UIView *) view {
if (self = [super init]) {
self.opaque = NO;
self.backgroundColor = [UIColor clearColor];
parentView = view;
CGRect rect = CGRectMake(0, - height, parentView.bounds.size.width, height);
self.frame = rect;
label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, rect.size.width, 20)];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.opaque = NO;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
position = MessageBoardBottom;
[self addSubview:label];
}
return self;
}

- (void)dealloc {
[label release];
label = nil;
[super dealloc];
}

- (void) show {
CGPoint startPoint;
if (position == MessageBoardTop) {
startPoint = CGPointMake(parentView.bounds.size.width / 2.0, - height / 2);
} else {
startPoint = CGPointMake(parentView.bounds.size.width / 2.0, parentView.bounds.size.height + height / 2);
}
CGPoint endPoint;
if (position == MessageBoardTop) {
endPoint = CGPointMake(parentView.bounds.size.width / 2.0, height / 2);
} else {
endPoint = CGPointMake(parentView.bounds.size.width / 2.0, parentView.bounds.size.height - height / 2);
}

self.center = startPoint;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(_didEndAnimation)];
self.center = endPoint;
[UIView commitAnimations];
}

- (void) _didEndAnimation {
[NSThread sleepUntilDate:[[NSDate date] addTimeInterval:2]]; //wait
CGPoint endPoint;
if (position == MessageBoardTop) {
endPoint = CGPointMake(parentView.bounds.size.width / 2.0, - height / 2);
} else {
endPoint = CGPointMake(parentView.bounds.size.width / 2.0, parentView.bounds.size.height + height / 2);
}
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
self.center = endPoint;
[UIView commitAnimations];
}

- (void)drawRect:(CGRect)rect {
CGRect allRect = self.bounds;
CGRect boxRect = CGRectMake(1, 0, allRect.size.width - 2, allRect.size.height - 2);
CGContextRef ctxt = UIGraphicsGetCurrentContext();
[self fillRoundedRect:boxRect inContext:ctxt];
}

- (void)fillRoundedRect:(CGRect)rect inContext:(CGContextRef)context {
CGContextBeginPath(context);
CGContextSetGrayFillColor(context, 0.0, backgroundAlpha);
CGContextMoveToPoint(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect));
float topRadius = radius;
float bottomRadius = radius;
if (position == MessageBoardTop) {
topRadius = 0.0f;
} else if (position == MessageBoardBottom) {
bottomRadius = 0.0f;
}
CGContextAddArc(context, CGRectGetMaxX(rect) - topRadius, CGRectGetMinY(rect) + topRadius, topRadius, 3 * M_PI / 2, 0, 0);
CGContextAddArc(context, CGRectGetMaxX(rect) - bottomRadius, CGRectGetMaxY(rect) - bottomRadius, bottomRadius, 0, M_PI / 2, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + bottomRadius, CGRectGetMaxY(rect) - bottomRadius, bottomRadius, M_PI / 2, M_PI, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + topRadius, CGRectGetMinY(rect) + topRadius, topRadius, M_PI, 3 * M_PI / 2, 0);
CGContextClosePath(context);
CGContextFillPath(context);
}

+ (MessageBoard *)showMessageBoard:(UIView *)view message:(NSString *) message {
MessageBoard *board = [[[MessageBoard alloc] initWithView:view] autorelease];
board.label.text = message;
[view addSubview:board];
[board show];
return board;
}

@end


使うときは
[MessageBoard showMessageBoard:view message:@"メッセージ"];
で。

既にそういう便利なものがあるとか...こうした方がもっといいよ..とかあれば指摘してもらえると嬉しいです。
• • •

2010年12月2日木曜日

MBA11インチとWiMax

MBA11インチとWiMaxのUSBタイプを購入しました。

今は会社帰りの喫茶店。
いつでもどこでもマシンがあり、ネットがある幸せを噛み締めています。

自宅にはMBP13インチもあるので、MBA買ってもつかうかなぁ? と思っていましたが、
常に持ち運びができるサイズなので結構使います。
自宅でも、RPGゲームをしている際に攻略ページをみながらやるとかにも...w

WiMaxは、UQFlat年間パスポート 3,880円/月 にしました。
価格.comだと、イー・モバイル/UQ WiMAX/FOMA/ソフトバンク 高速モバイル比較というのがあって、なんやらいろいろ割り引きがあって最初の1年は2,580円/月というプランもあったんですが、どうせ何年も契約するんだろうしー ということで本家のやつにしてしまいました。

WiFiルータにするか、USBタイプにするかも迷ったんですが、マシンの充電がまだ残っているのにルータの充電池終了というのは悲しい&充電面倒 なのでUSBタイプに。まぁ、基本は一人で使うことの方が多いでしょうし。
連続8時間つなげれるという噂のAtermWM3500Rも気になったんですが..ね。

こうやって契約していくと、家で使っているやつの契約がなんだかもったいなく思ってきてしまいます。
いっそ解約して、家でもモバイルWifiって手もあるよなぁー
• • •