SimpleCap のソースコードをGitHubへ公開しました

2012年10月11日木曜日 | Published in | 0 コメント

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

ライセンスは MITです



・SimpleCap-1.2 は現在公開中のバージョンです。
・SimpleCap-1.3 は開発中の未公開バージョンです(範囲ヒストリなどがあります)

技術的な情報は旧Cocoaの日々にたくさん書いてあるのでそちらを参照してみてください。
旧Cocoaの日々
SimpleCapの開発を始めたところから記載があります。あのころはブログを毎日書いていたので、これを読むとSimpleCapの一つ一つの実装風景を見ることができます(長いけど)。


SimpleCapとは...

「Mac用のスクリーンショットツール。画面上の好きなエリアを簡単にイメージ保存できます。メニューバー常駐型なのですぐに使える。」

紹介記事など




- - -
このアプリを開発していた数年の間に子供3人が生まれたので個人的には思い出深いソフトです。通院中の妻を待ちながら喫茶店でプログラミング、なんてこともありました。まあ双子の出産が開発を止めた最大の理由でもあるのですが。

いつかはソースを公開しようと考えていましたが忙しさにかまけて放置状態にしていました。先日ソースを見せて欲しいと依頼が来たので、これをいい機会だと思い Githubへ公開しました。はっきり言って数年前のMac/Cocoa用コードなので、今のモダンなiOS/Cocoaコードに比べるとかなり古臭いです。それでも何かの役に立てればと思い公開しておきます。好きに使ってください。引き継いでのバージョンアップ大歓迎です ^^。ちなみにアプリは自分自身が毎日使っているヘビーユーザです。

なお今となってはほとんど忘れてしまったのですが、ネット上のコードをコピペしている箇所があるかもしれません。もし気がつかれた方がいたらご指摘下さい。クレジット表記を追加します。


PR: 今は iOSアプリをメインで開発しています。良かったらどうぞ。
Lakesoft
Lakesoft
EverGear - Evernote投稿ツール
★★★★☆
42件の評価
App Store

※こちらはソース公開してませんのであしからず。





EverGear 1.4 がリリースされました

2012年6月27日水曜日 | Published in | 0 コメント

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

EverGear - 万能投稿ツール App

カテゴリ: 仕事効率化

価格: ¥170


要望の多かった履歴の再編集機能搭載の他、アイコンを一新しました。


Evernoteを使っている方は是非お試し下さい。

サポートページ (facebook)
EverGear | Facebook



EverGear 1.2 がリリースされました

2012年6月6日水曜日 | Published in | 0 コメント

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



EverGear - Lakesoft

目玉の機能は、URLスキーム対応と起動時即編集になりますが、その他にも色々と改良が入っています。実装メモも付けたので参考なればと思います。


新機能および調整


・起動時即編集機能
・URLスキーム対応
・スワイプによるカーソル移動
・写真の最大枚数 30枚
・Evernoteに投稿した時の日時の変更
・下書き-ログ画面に「写真」ボタンを追加
・ひな形経由の下書きの保存ルール変更
・写真サイズ追加(320px)
・写真が1枚も無いときに写真タブを開くとカメラが起動することを止めた
・カメラの縦・横の切替時の操作感を調整
・タイトルのみで本文がない場合、投稿時に本文にタイトルを挿入


不具合修正


・下書きに一覧に表示されているサイズが実際よりも割増しで表示されている問題が解消しました
・デフォルトひな形利用時にノートブックが下書きに反映されない件が解消しました
・1件も下書きが無い状態で「下書き」タブをクリックするとクラッシュする件が解消しました


URLスキーム対応


単純起動に加え、初期の動作モードを指定することができます。

(1) 単純起動
jp.lakesoft.EverGear://

(2) ノート新規作成
jp.lakesoft.EverGear://draft/add

新規作成用パラメータ
mode:0=テキスト入力 | 1=撮影モード | 2=カメラロール | 3=メモ入力 ※省略時は 0 指定と同じ
text:テキストの初期値(要UTF-8によるURLエンコード)

例えば、下記で呼び出すと初期テキストが "Hello" で、撮影モードで起動します。
jp.lakesoft.EverGear://draft/add?mode=1&text=Hello

次バージョンではひな形(テンプレート)の指定も可能になる予定です。

実装メモ

EverGearのような複数のUIモードと複数のデータを扱うアプリの場合、テキスト入力モードやカメラ撮影モードで立ち上げようとすると状態の管理が必要になる(これは後述する「起動時即編集」も同じ)。例えば、テキスト編集中の状態で他アプリから URLスキームを呼び出されたらどうするか?あるいは撮影中の場合は。EverGearでは、一旦現在編集中のデータをすべて保存した後、開いていたテキスト編集画面(モーダル)を閉じ、ホーム画面へ一旦戻る。その後、URLスキームの指示に従った画面を開き直している。

またURLスキームから呼び出された場合ユーザはアニメーションは期待していないはずだから、画面の開閉メソッドにはすべてアニメーションON/OFFの引数を追加し、これで制御するようにしてある。


起動時即編集


「設定」で「起動時即編集」をオンにすると、アプリがアクティブになる毎に新規入力モードで立ち上がります。前回起動時に下書きを開いていた場合はそのノートの編集モードで立ち上がります。

実装メモ

EverGear はUIに階層/状態がある。例えばテキスト入力中だと、入力画面のViewControllerがモーダル表示され、かつキーボードが表示されている。他には削除確認のアクションシートが出ていたり、撮影用のビューが出ているなど。この為一旦開いていた画面やモーダルな表示を閉じて、その上で目的の画面を改めて開く必要がある。

そんなわけで見た目は大した機能ではないが、裏側の実装はここが面倒だった。またアプリがアクティブになったタイミングで以前の画面を閉じていたのではタイムラグが生じることがわかった。そこで発想を変えて非アクティブになるタイミングで開いていた画面やモーダル表示を閉じるようにした。さらにこの過程でのアニメーションは不要なので、既存のメソッドにすべてアニメーションON/OFFの引数を追加して制御するようにした。これによって前回の状態にかかわらず、アプリをアクティブにすると一瞬で編集モードとして立ち上がるようにすることができた。

なお起動時即編集がやっていることは URLスキームの処理と変らないので実はこの機能は URLスキームの処理を内部的に使っている。つまりアクティブ時のイベント処理無いで下書き新規作成用のURLスキームを作成して、その処理へ回している。




FaceBookで最新情報を提供しています。
EverGearサポートページ

Twitter
@evergear


アプリ EverGear をリリースしました

2012年5月18日金曜日 | Published in | 2 コメント

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

Evernote投稿用アプリ「EverGear」をリリースしました。1つのノートに20枚の写真やメモを付けることができたり、ノートのひな形(テンプレート)を作るといった特徴を持つアプリです。
※有料です。


写真


1つのノートに20枚までの写真を登録することができます。写真にメモを残すこともできます。



ログ


メモだけを残すこともできて、それらをまとめて時系列に表示できます。メモと写真の集まりを「ログ」と呼んでいます。※メモの件数に制限はありません。



ひな形


あらかじめ文字やノートブック、タグを定義しておいてそれをノート作成時に利用することができます。登録しておいたひな形はノート作成時にメニューから選んで利用できます。



送信


バックグラウンド送信に対応しています。送信中のノートは送信タブで見ることができます。



履歴


送信したノートを後から見返すことができます(最近50件まで、それ以前は自動削除)。



ノート編集


テキストの編集やノートブック指定、タグ指定など基本的な機能が揃っています。



設定画面





Evernote


ログは Evernoteに送られるとメモと写真(サムネイル)が時系列に記録されます。その下に写真が並びます。
構成イメージ
+ーーーーーーーーーー+
|   テキスト   |
+ーーーーーーーーーー+
|   ログ1    |
|   ログ2    |
|    :     |
+ーーーーーーーーーー+
|   写真1    |
|   写真2    |
|    :     |
+ーーーーーーーーーー+

Mac版のEvernoteで見たイメージ


ログ(メモ+サムネイルの時系列表示)

写真

iPhone版のEvernoteで見たイメージ


ログ(メモ+サムネイルの時系列表示)

写真


サポートサイト


Facebookにあります。リリース情報などは今後そちらで公開していきます。



UIDocumentInteractionController にファイルを別名で渡す

2012年3月6日火曜日 | Published in | 0 コメント

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

問題


UIDocumentInteractionController で他のアプリにファイルを渡すことができる。こんな感じ。
self.documentInteractionController =
    [UIDocumentInteractionController  interactionControllerWithURL:url];
self.documentInteractionController.delegate = self;
[self.documentInteractionController presentOptionsMenuFromBarButtonItem:
    self.sendApplicationButtonItem animated:YES];

普通はアプリで作成したファイルのURLをそのまま渡せば事足りるのだが、ネットワークからダウンロードしてキャッシュしているファイルだったりすると名前が管理上の適当な名前になっているケースがある。
実名:UserDocument.pdf
キャッシュ名:js9798sfs8df9s9fsd.pdf
キャッシュファイルのURLをそのまま他のアプリへ渡すと "js9798sfs8df9s9fsd.pdf" みたいな名前で扱われて使い勝手が悪い。できれば渡した先のアプリでも "UserDocument.pdf" として扱わせたい。

UIDocumentInteractionController にはこういった目的の為に nameプロパティが用意されている。
@property(nonatomic,copy) NSString *name
This property contains the filename without any preceding path information. The default value of this property is derived from the path information in the URL property. You can change the value of this property as needed if you want to associate a different name with the file.
ところが nameプロパティを設定しても送った先のアプリでは使われず "js9798sfs8df9s9fsd.pdf" のまま。

どうしても UIDocumentInteractionController へ渡す URLのファイル名を "UserDocument.pdf" にする必要があるようだ。方法としてはキャッシュファイルをコピーする方法がある、がこれは非効率すぎる。こういう時はシンボリックリンクを使うのがいい。

(参考)ソフトリンク - Wikipedia


シンボリックリンク


iOS でもシンボリックリンクを使うことができて NSFileManagerが標準でサポートしている。
createSymbolicLinkAtURL:withDestinationURL:error:

そこで UIDocumentInteractionController へ渡す直前にシンボリックリンクを作成してそのURLを渡してみた。
if ([fileManager createSymbolicLinkAtURL:cacheURL withDestinationURL:newURL error:&error]) {
        NSLog(@"%s|%@", __PRETTY_FUNCTION__, @"a symbolic link is created");
    } else {
        NSLog(@"%s|%@", __PRETTY_FUNCTION__, error);
    }

結果は ×

ファイル名は正しく渡るのだが送り先のアプリで正しく扱われない。詳しく調べていないがシンボリックリンク自体を開いているのだがと思われる(実体へのリンク情報が書かれているだけで実質何も入っていない)。

うーむ。


ハードリンク


どうするかと考えていたところ @nakiwo さんからこんなヒントが。

ハードリンクか!

(参考)ハードリンク - Wikipedia

iOS では NSFileManager がハードリンクもサポートしている。
linkItemAtURL:toURL:error:

早速試してみた。
if ([fileManager linkItemAtURL:cacheURL toURL:newURL error:&error]) {
        NSLog(@"%s|%@", __PRETTY_FUNCTION__, @"a hard link is created");
    } else {
        NSLog(@"%s|%@", __PRETTY_FUNCTION__, error);
    }

結果は ◯

送り先のアプリで意図したファイル名 "UserDocument.pdf" として扱われ、中身もちゃんと渡っている。

GoodReader, DropBox, Numbers などで動作確認できた(4S/iOS5.0.1)。
ただ iBookのみファイル名が英数字の羅列になっていた(読み込み時は意図したファイル名が一瞬表示されるのだが)。


実装パターン


作ったハードリンクは消しておく必要がある。消さないと元のファイルを消してもハードリンクが残ってしまう(参照カウントが残っている限りファイルの実体が消えない)。作るタイミングと消すタイミングは UIDocumentInteractionControllerDelegate で用意されているアプリ送出前後のメソッドを使うのがいい。
- (void)documentInteractionController:(UIDocumentInteractionController *)controller
           willBeginSendingToApplication:(NSString *)application
{
    // ハードリンク作成 ....
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller 
           didEndSendingToApplication:(NSString *)application
{
    // ハードリンク削除 ....
}
送るメニューを出す手順の中で呼び出す [UIDocumentInteractionController interactionControllerWithURL:url] の時点では実体が存在する必要はない。先ほどのデリゲート documentInteractionController:willBeginSendingToApplication: で作っても間に合った。


- - - -

※今回はサンプル無しです。


[iOS] iOS5 から標準で UINavigationBar に複数のボタンを配置することができるようになった

2012年1月5日木曜日 | Published in | 0 コメント

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

UINavigationItem の API に iOS5 から rightBarButtonItems があることに気がついた。複数形ということは...?

早速試してみた。こうすると。
UIBarButtonItem *item1 = [[UIBarButtonItem alloc]
                              initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                              target:self
                              action:@selector(touched:)];
    
    UIBarButtonItem *item2 = [[UIBarButtonItem alloc]
                                initWithBarButtonSystemItem:UIBarButtonSystemItemCamera
                                target:self
                                action:@selector(touched:)];

    self.navigationBar.topItem.rightBarButtonItems =
        [NSArray arrayWithObjects:item1, item2, nil];
こうなる。
複数ボタンが標準でサポートされたのか。

横向きも問題なし。

スペースも入れられる。


3個もいける。


左も leftBarButtonItems が用意されている。

今回は試していないが戻りボタン(左のとんがっているやつ)がある場合はその右側に表示されるとのこと。

左右にボタンを配置するとタイトル→左→右の順で優先される。下記は左右に4つのボタンを指定した時の表示。幅が不足している場合は表示されない。

横向きにすると全部表示された。



タイトルが長いとその分表示幅が狭くなるので表示個数が減る。

なお右ボタンの場合、右から順番に配置される。


ソースコード


GitHub からどうぞ。
MultiNavigatorItemButtons at 2012-01-05 from xcatsan/iOS5-Sample - GitHub


関連情報


UINavigationBar に複数の UIBarButtonItem を配置するには - 24/7 twenty-four seven
UIToolbar をカスタムビューとして配置する方法。iOS 4 ではこういった方法しか無い。



リファレンスマニュアルを mac から ios に切り替える(割とどうでもいい)Tips

2012年1月3日火曜日 | Published in | 0 コメント

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

Googleで Appleのサイトのリファレンスマニュアルを検索すると iOSではなく Mac OS X の方がヒットすることがある(特にNS系クラスなど)。これを iOSに切り替えるTips。

方法は簡単で URLの mac を ios へ変えて再読込するだけ。

こうなる↓

両方のOSに存在する実装であれば、クラスリファレンスに限らず各種ガイド・マニュアル類でも同じ方法が使える。

Cocoaの日々 - 2012年正月

2012年1月2日月曜日 | Published in | 0 コメント

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

あけましておめでとうございます。
本年もよろしくお願いします。

毎年正月はこのブログのことについて書いています。今年も思ったことをとりとめなく書いておきます。

昨年はブログの毎日更新をやめた他、秋以降は忙しかったこともありブログの更新頻度はずいぶん下がってしまいました。今年も当面は頻度が下がると思いますが技術情報を少しでも提供して共有できればと思っています。

また昨年正月に目標としていたことはほとんど実行できませんでした。
Cocoaの日々: Cocoaの日々 - 2011年元旦
唯一できたのは「Cocoaの日々情報局」を立ち上げたくらい(RoRは使っていないが)。

その点プログラミングに関して昨年は不本意な一年でした。ただその分、子育てやハーフマラソン完走、TOEIC目標クリアなどそれなりに充実した一年だったと思います(なかなか両立は難しい...)。

さて今年は趣味のプログラミングに関して今までのやり方を大きく変えようと考えています。

(今まで)
・基本的にライブラリを使わず手作り
・知らない技術は網羅的に検証しながら進める
・その成果を基本的にブログで公開
・1つのアプリに時間をかける

これを今年は変えていく。

(今年)
→ 他の人のライブラリを積極的に利用する
→ 丁寧な検証はやらない
→ ブログは最小限に
→ 1つのアプリに時間をかけない

趣味なので時間をかけて検証して石を彫るように進める開発はそれなりに楽しかったけれど、同じやり方を続けるのは進歩がない。それに以前と違って使える時間も無い。そこで今年は思い切ってそれを変えていく。うまくいくかわからないが良い変化になればと考えている。

この数ヶ月は昨年来開発を続けてきたiPhoneアプリを完成させて公開することがまずは今年最初の目標になります(Evernote系のアプリを製作中)。その後は2〜3ヶ月毎に1本づつアプリを作って行きたい。

- - - -

情報局ともどもこのブログを今年もよろしくお願いします。



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