【StackOne】アイコンボツ案(アプリのできるまで)

2014年8月31日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

いろいろやったということで。









決定はこれ

【StackOne】予約語一覧表

2014年8月30日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

StackOneで使える予約語の一覧を公開。日本・日本語以外にも対応しているので、値によっては他の予約語と同じ値を返すものや、値が無いもの(空)がある。

日時


意味タグ
日付%date2014/8/30
日付 (ショートスタイル)%date12014/8/30
日付 (ミディアムスタイル)%date22014/8/30
日付 (ロングスタイル)%date32014年8月30日
日付 (フルスタイル)%date42014年8月30日土曜日
時刻%time20:04
時刻 (ショートスタイル)%time120:04
時刻 (ミディアムスタイル)%time220:04:09
時刻 (ロングスタイル)%time320:04:09 JST
時刻 (フルスタイル)%time420時04分09秒 日本標準時
%y2014
%yy14
%yyyy2014
%M8
%MM08
%MMM8月
%MMMM8月
%d30
%dd30
曜日%eee
曜日%eeee土曜日
%h8
%hh08
%k20
%kk20
%H20
%HH20
%m4
%mm04
%s9
%ss09
午前/午後%a午後
タイムゾーン%zzzJST
タイムゾーン%zzzz日本標準時
タイムゾーン%ZZZ900
タイムゾーン%ZZZZGMT+09:00


位置情報


意味タグ
住所%address東京都 中央区日本橋9丁目101番3号
緯度%latitude35.681382.
経度%longitude139.766084.
地図リンク%map<a href="http://maps.google.com/maps?q=地図@35.681382,139.766084&z=16">地図</a>


住所


意味タグ
市区町村%addr.Citry東京都中央区
%addr.Country日本
国コード%addr.CountryCodeJP
場所名%addr.Name日本橋9丁目101番3号
郵便番号拡張%addr.PostCodeExtension
都道府県%addr.State東京都
番地%addr.Street日本橋9丁目101番3号
行政区%addr.SubAdministrativeArea
%addr.SubLocality日本橋
番地%addr.SubThoroughfare101番3号
町丁%addr.Thoroughfare日本橋9丁目
%addr.ZIP〒103-0123


- - - -

StackOne活用方法の紹介記事。旅行の写真に一言添えてエバーノートに記録。いいね。






新作アプリをリリースしました【スーパーの電卓 買い物さん】

2014年8月21日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加



【スーパーの電卓 買い物さん】
iPhone専用 / 無料

「カゴの中身はいくら?」
「予算1000円だけどあといくら買える?」(もちろん消費税も考慮して)
「これをやめたら、あれを買えるかな?」

買物専用の電卓を作りました。
ただ、ただ、金額を入れるだけで計算完了です。
何も難しい操作は要りません。ただ入れるだけでいいのです。

特徴
・簡単入力でさくさく計算
・予算設定で、あといくら買えるか一目瞭然
・タイムセールの%割引に対応
・強力な消費税対応(内税・外税、精算方式に切り捨て方法まで)
・便利な買物リスト
・買物スキルを磨く、買物スコアに買物レベル(ゲーム感覚)

特に便利なのが「あといくら」。例えば予算 1,000円と設定しておけば、予算内で買える金額がひと目でわかります。もちろん消費税が考慮されているのでレジに行ったら消費税分が予算オーバー、なんてことはありません。予算設定は意外にハマる機能で、あーでもないこーでもないと試行錯誤が繰り返していくと買い物がゲームみたいな感覚に。何よりも予算ぴったりに買い物ができた時は結構うれしかったりします。

毎日の買い物がきっと楽しくなる「買い物さん」を是非お試し下さい。
(奥さまがいる方は是非おすすめ下さいませ)


メニュー


ただ、ただ、入れればいいのです(自動的に足し上げていきます)



買い物計算に必要な機能は全部あります



消費税もバッチリ



終了後に「買い物スコア」でスキル判断。スコアが貯まるとレベルアップも。







【スーパーの電卓 買い物さん】
iPhone専用 / 無料

アプリ【StackOne】最新バージョン 1.4 リリース〜 iPad対応

2014年7月11日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

エバーノート投稿アプリ【StackOne】の最新バージョン 1.4 がリリースされました。




今回のリリースから iPadでも使えるようになりました。








投稿後のノートはこんな感じで見えます(エバーノートiPad版)。


紹介記事など






- - - -
iPad対応記念セール実施中です。
400円→100円

興味のある方はこの機会にどうぞ。


UITableView 初期位置設定 in UINavigationController (iOS7)

2014年7月5日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

極私的メモ。UINavigationControllerで遷移してきた画面でUITableViewを表示する時、任意の位置のセルで初期表示したい。
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView reloadData];
    [self _scrollAnimated:NO];          // 任意のセルへスクロール
}
viewWillAppearに書いてもだめ(iOS7)。viewDidAppearだと画面がちらつく。

viewDidLayoutSubviewsに書いたらうまくいった。ただしフラグを使って初回だけに限定してやる。
@property (nonatomic, assign) BOOL didLayoutSubviews;

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if (!self.didLayoutSubviews) {
        [self _scrollAnimated:NO];
        self.didLayoutSubviews = YES;
    }
}



アプリ【StackOne】最新バージョン 1.3 リリース(プロモーション動画作ってみました)

2014年6月13日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

エバーノート投稿アプリ【StackOne】の最新バージョン 1.3 がリリースされました。





主な新機能
・TextExpander
・ルール並び替え
・ルールリスト
ほか


今回はプロモーション動画を作ってみた。

素人感丸出し。。当初は手に持って実際に操作しているところを撮影しようかと思い、他のiPhoneで撮影するなどやってみたがこれは手間がかかりすぎるため断念。今回はスクリーンだけを写す簡易な方法を撮った。最近はスクリーンだけのプロモ動画は少なく、数年前の古さを感じさせる雰囲気あり。


使ったアプリは2つだけ。

[1]Reflector - iPhoneの画面をAirPlay経由でMacに移すアプリ。$12.99で購入。

これは結構役にたった。なおYosemite+iOS8では標準で同等のことができるようになるらしいが。

[2]iMovie - 動画の編集

iMovieは初めての操作だったけど、今回の動画は3〜4時間ぐらいでできたと思う。操作する時はあまり細かい事は考えずにとにかく必要な場面(シーン)をたくさん撮るのがコツで、最後にiMovieで切り貼り編集して見られる動画にまとめていくという流れ。一度場面が揃えばあとは編集で(ある程度)どうにでもなるので一旦慣れてしまえば意外に面倒さはなかった。心がけたのは1分に収まり、映像がテンポよく流れていくところ。

BGMはここのものを使わせてもらった。

アプリは軽快さが売りの一つなので、そのイメージに合う曲を探して充ててみた。

- - - -
今後AppStoreでは紹介動画の掲載も可能になるということなので動画制作にも徐々に慣れた方が良さそう。

【Library】写真のグルーピングやフィルタリングが可能な ALAssetsLibrary用ライブラリ

2014年5月31日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

ALAassetsLibraryから取得した写真を月ごとにグルーピングしたり、JPEGだけあるいはスクリーンショットだけを抜き出すといった処理が行えるライブラリを作りました。このライブラリではモデルクラスのみを提供しています(ビューはありません)。



基本


クラス図はこんな感じ。

左の3クラス(LKAssetsLibrary,LKAssetsGroup,LKAsset)がALAssetsLibraryの主要クラスのラッパーとなっていて便利メソッドが用意されている。

LKAssetの定義
@interface LKAsset : NSObject

// Properties (Status)
@property (assign, nonatomic, readonly) BOOL deleted;

// Properties (Image)
@property (weak  , nonatomic, readonly) UIImage* thumbnail;
@property (weak  , nonatomic, readonly) UIImage* aspectRatioThumbnail;
@property (weak  , nonatomic, readonly) UIImage* fullScreenImage;
@property (weak  , nonatomic, readonly) UIImage* fullResolutionImage;

// Properties (Date number)
@property (assign, nonatomic, readonly) NSTimeInterval timeInterval;
@property (assign, nonatomic, readonly) NSInteger dateTimeInteger;  // yyyyMMddHH

// Properties (ALAsset property)
@property (strong, nonatomic, readonly) NSURL* url;
@property (strong, nonatomic, readonly) CLLocation* location;
@property (strong, nonatomic, readonly) NSDate* date;
@property (strong, nonatomic, readonly) NSString* fileExtension;    // upper string JPG, PNG, ...
@property (assign, nonatomic, readonly) CGSize size;
@property (assign, nonatomic, readonly) LKAssetType type;

// Properties (Filter)
@property (assign, nonatomic, readonly) BOOL isJPEG;
@property (assign, nonatomic, readonly) BOOL isPNG;
@property (assign, nonatomic, readonly) BOOL isScreenshot;
@property (assign, nonatomic, readonly) BOOL isPhoto;
@property (assign, nonatomic, readonly) BOOL isVideo;
  :
ちなみに fullScreenImageとfullResolutionImageは回転している写真を適正に補正してくれる。

使い方の例。
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(_assetsLibraryDidSetup:)
                                                 name:LKAssetsLibraryDidSetupNotification
                                               object:nil];
    self.assetsLibrary = [LKAssetsLibrary assetsLibrary];
    [self.assetsLibrary reload];
}

ALAssetsLibraryと異なり blocksではなく通知ベースで使う。アセットの取得が済むと LKAssetsLibraryDidSetupNotification が通知されるので、後は LKAssetsGroupとLKAssetを取り出して使っていく。

- (void)_assetsLibraryDidSetup:(NSNotification*)notification
{
    [self.tableView reloadData];
}

グループのタイトルとサムネイルをテーブルのセルへ表示する例
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GroupCell" forIndexPath:indexPath];

    LKAssetsGroup* assetsGroup = self.assetsLibrary.assetsGroups[indexPath.row];   
    cell.imageView.image = assetsGroup.posterImage;
    cell.textLabel.text = assetsGroup.description;
    return cell;
}

アセット(画像)のサムネイルをUICollectionViewCellへ表示する例
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    AssetCell* cell = (AssetCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"AssetCell"
                                                                           forIndexPath:indexPath];
    LKAsset* asset = [self.assetsCollection assetForIndexPath:indexPath];
    cell.imageView.image = asset.thumbnail;
    return cell;
}


コレクション


さてこのライブラリの売りは基本で紹介したクラスを利用して作られた LKAssetsCollectionにある。LKAssetsCollectionは様々な条件を満たすアセットの集合を取り扱うことができる。例えばLKAssetsCollectionを使うと「月ごと」に分類された 「JPEGとPNG画像」を「日付降順でソート」したアセットの配列を作ることができる。

LKAssetsCollection
   .entries
   |
   |--LKAassetsCollectionEntry(2014年5月)
   |   .assets
   |    |
   |    |--LKAsset(JPEG画像 2014/05/21 10:00)
   |    |--LKAsset(PNG 画像 2014/05/11 10:00)
   |    |--LKAsset(JPEG画像 2014/05/01 10:00)
   |    :
   |--LKAassetsCollectionEntry(2014年4月)
   |   .assets
   |    |
   |    |--LKAsset(JPEG画像 2014/04/21 10:00)
   |    |--LKAsset(PNG 画像 2014/04/11 10:00)
   |    |--LKAsset(JPEG画像 2014/04/01 10:00)
   |    :
   :

LKAssetsCollectionの配下には LKAssetsCollectionEntryの配列があり、これがさらに LKAssetsの配列を持つ。

一旦コレクションが作れれば後は indexPathで末端の LKAssetを取り出せるので UITableView や UICollectionView で簡単に使うことができる。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    AssetCell* cell = (AssetCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"AssetCell"
                                                                           forIndexPath:indexPath];
    LKAsset* asset = [self.assetsCollection assetForIndexPath:indexPath];
    cell.imageView.image = asset.thumbnail;
    return cell;
}

LKAssetsCollectionのインターフェイス。
@interface LKAssetsCollection : NSObject

@property (nonatomic, weak  , readonly) LKAssetsGroup* group;
@property (nonatomic, strong, readonly) NSArray* entries;   // 

@property (nonatomic, strong, readonly) id <LKAssetsCollectionGrouping> grouping;
@property (nonatomic, strong) id <LKAssetsCollectionFilter> filter;
@property (nonatomic, strong) id <LKAssetsCollectionSorter> sorter;

+ (instancetype)assetsCollectionWithGroup:(LKAssetsGroup*)group grouping:(id <LKAssetsCollectionGrouping>)grouping;

@end

@class LKAsset;
@interface LKAssetsCollection (NSIndexPath)
- (LKAsset*)assetForIndexPath:(NSIndexPath*)indexPath;
@end

コレクションに含めるアセットを決める条件は3種類指定することができる。

・グルーピング  (例)年ごと、月ごと、日ごと、時ごと
・フィルター   (例)JPEGのみ、PNGのみ、スクリーンショットのみ、ほか
・ソーター    (例)日付昇順・降順

上記の処理を定義するためにそれぞれプロトコルが定義されている。
 LKAssetsCollectionGrouping
 LKAssetsCollectionFilter
 LKAssetsCollectionSorter
これらを実装するインスタンスを LKAssetsCollectionへ渡すことで条件に合致するアセットの集合ができあがる。

初期化の例
LKAssetsCollectionGrouping* grouping = [LKAssetsCollectionGrouping assetsCollectionGroupingWithType:self.groupingType];
   
self.assetsCollection = [LKAssetsCollection assetsCollectionWithGroup:self.assetsGroup
                          grouping:[LKAssetsCollectionDateGrouping groupingWithType:self.groupingType]];
self.assetsCollection.filter = [LKAssetsCollectionGenericFilter filterWithType:LKAssetsCollectionGenericFilterTypeJPEG|LKAssetsCollectionGenericFilterTypePNG];
self.assetsCollection.sorter = [LKAssetsCollectionDateSorter sorterAscending:NO];

LKAssetsCollectionDateGrouping や LKAssetsCollectionGenericFilter、LKAssetsCollectionDateSorter は先程のプロトコルの実装クラスになる。これらは標準で提供される。なおグルーピングと、ソースとなる LKAssetsGroupは初期設定しかできず後からは変更できない(immutable)。一方、フィルターとソーターは後から変更を適用することが可能。

LKAssetsCollectionDateGrouping で指定可能なグルーピング単位
typedef NS_ENUM(NSInteger, LKAssetsCollectionGroupingType) {
    LKAssetsCollectionGroupingTypeAll      = 0,
    LKAssetsCollectionGroupingTypeYearly   = 11,          // 年ごと
    LKAssetsCollectionGroupingTypeMonthly  = 12,          // 月ごと
    LKAssetsCollectionGroupingTypeWeekly   = 13,          // 週ごと(月曜始まり〜日曜までを1週間とみなす)
    LKAssetsCollectionGroupingTypeDaily    = 14,          // 日ごと
    LKAssetsCollectionGroupingTypeHourly   = 15,          // 時ごと
};

LKAssetsCollectionGenericFilter で指定可能なフィルタ条件。ビットORで複数指定が可能。
typedef NS_ENUM(NSUInteger, LKAssetsCollectionFilterType) {
    LKAssetsCollectionFilterTypePhoto        = (1 << 0),
    LKAssetsCollectionFilterTypeVideo        = (1 << 1),
    LKAssetsCollectionFilterTypeJPEG         = (1 << 2),
    LKAssetsCollectionFilterTypePNG          = (1 << 3),
    LKAssetsCollectionFilterTypeScreenShot   = (1 << 4),
    LKAssetsCollectionFilterTypeAll          = 0xFFFFFFFF,
};

コレクションクラスは、グルーピング・フィルター・ソーターの各プロトコルに準拠したインスタンスを利用するので、標準以外の処理を行わせたい場合はプロトコルに適合したクラスを用意すればいい(もちろん標準提供のこれらのクラスをサブクラス化しても良い)。


その他

グループやアセットの変更通知

グループやアセットが追加されたり、変更や削除された場合、LKAssetsLibraryはそれを検出して内部で持っているグループをそれに合わせて更新する。アセットの増減があった場合はコレクションにも変更が自動的に反映される。

また処理後に独自の通知も出す。
// Notifications (Update)
// store updated group into userInfo[LKAssetsLibraryGroupsKey]
extern NSString * const LKAssetsLibraryDidInsertGroupsNotification;
extern NSString * const LKAssetsLibraryDidUpdateGroupsNotification;
extern NSString * const LKAssetsLibraryDidDeleteGroupsNotification;

// Notifications (keys)
extern NSString * const LKAssetsLibraryGroupsKey;

NSNotificationの userInfoから LKAssetsLibraryGroupsKeyをキーにして追加・変更のあった(あるいは削除された)LKAssetsGroupインスタンスを取得できる。

- (void)_assetsLibraryDidInsertGroup:(NSNotification*)notification
{
    NSArray* groups = notification.userInfo[LKAssetsLibraryGroupsKey];
    NSLog(@"%s|inserted: %@", __PRETTY_FUNCTION__, groups);
}

iCloud上の写真

iCloud上で作成した共有アルバムの写真は、サムネイルは入手できるものの実体画像は取得できない場合がある。これは明示的にダウンロードする必要がある為。標準の写真アプリで閲覧(ダウンロード)してある場合はそのキャッシュが使える(表示できる)。最初のバージョンではこのケースに対応できていない(デモプログラムでもその場合、サムネイルは表示されても詳細が表示できない)。フォトストリームは自動的にダウンロードされるので大丈夫なようだ。



デモプログラム


付属のデモプログラムを実行すると最初にグループの一覧が表示される。
これは LKAssetsLibrary.assetsGroup(NSArray)を並べたもの。

グループを1つ選んでタップすると中の写真が一覧される。
グルーピング(ALL | Year | Month | Week | Day | Hour)、並び順(Ascending | Descending)、種別(All | JPEG | Screen | Video)が選べて、その場で表示が変わる。ここで先ほど説明した LKAssetsCollection を使っている。

なおビデオはサムネイルは表示されるが、詳細では表示されない(ビデオ再生を実装していないだけ)。


その他


グルーピングの Weeklyの処理はいまいちイケていないので少し遅い。大量の写真がある場合、デモでも他のグループに比べて一瞬遅れるのが分かるかもしれない。


インストール


CocoaPodsを使う。

$ pod install LKAssetsLibrary

今までプラベートなリポジトリしか使っていなかったので CocoaPodsの公式へ登録するのは初めて。先日公開された Trunkを早速使った。この辺りは下記のブログが参考になった。

CocoaPods Trunkを利用したライブラリの追加方法


ライセンス


MIT です。基本好きに使って下さい。


- - - -
ようやくモデルができた。次は選択画面を作る。これは複数選択可能なイメージピッカーみたいなやつになる予定。

人気の投稿(過去 30日間)