-
UIBarButtonItemで隠されたボタンを使用する
Sunday, February 14, 2016
UIBarButtonItemには、typeを指定して、標準で用意されている様々なアイコンを使用できます。 (ここに一覧が掲載されています。) しかし、 < > ∧ ∨や、ゴミ箱アイコンといったものが用意されていません。 これを毎回画像で用意するのはしんどいし、"< >"と文字で生成するとなんかダサいし。。 ただ、標準アプリであるSafariとか、UINavigationBarの戻るボタン等、標準で< >を使っているのでなんとかして使えるなら使いたい。 それを解決してみます。 enum UIBarButtonHiddenItem: Int { case Previous = 101 case Next = 102 case Up = 103 case Down = 104 case Locate = 100 case Trash = 110 func convert() -> UIBarButtonSystemItem { return UIBarButtonSystemItem(rawValue: self.rawValue)! } } extension UIBarButtonItem { convenience init(barButtonHiddenItem item:UIBarButtonHiddenItem, target: AnyObject?, action: Selector) { self.init(barButtonSystemItem: item.convert(), target:target, action: action) } } このようにして、UIBarButtonHiddenItemを定義して、UIBarButtonSystemItemとのブリッジを作成します。…
-
OSSとコミット
Friday, February 12, 2016
最近は自分のソースをまとめたり、新しい実装を思いついてOSS化したりして、 何かとμライブラリを制作したりしていますが、 やっぱり他の人の書き方とかもすごい参考になるので、GithubのExploreやトレンドから探したり、 Qiitaの記事からライブラリ発掘して覗いてみたりしています。 それで「こういう書き方があるんだ!」って自分の知見が増えたり、 「あ、ここ直してみたいな」「こういう機能あったらいいな〜」とか思うこともあったりします。 なので最近ちょびちょびですが、Fork+Pull Requestで、気に入ったライブラリに対してコミットしたりもしています。 自分のためにもなるし、そのOSSを頑張って作ってくれた人の役に立てればそれも嬉しいしで、とても健全的な気がします。笑 ただ作る、自慢するだけじゃなくて、貢献する、助けになるという意識ももってこれからも頑張ろうと思った1日でした。 勝手に宣伝しちゃまずいのかわからないですが、本日は仕事の隙間時間をつかって、 takasekさんの、Notifwiftという、NSNotificationCenterでの通知管理を楽にするライブラリにコミットさせて頂きました。 今日は会社の人と焼き肉らしいのでこの辺で退散します。 明日は一日買い物と映画を満喫します!たまには外に出なきゃ…
-
ライブラリ「PDFGenerator」をアップデートしました
Thursday, February 11, 2016
先日ライブラリとして公開したPDFGeneratorを、1.0.0にアップデートしました。 以前のバージョンまででは、viewならviewのみ、viewならviewのみでしかPDFを生成できませんでしたが、 たとえば、 [view, image, image, view] のように、viewとimageを混ぜて生成出来るようになりました。 func generatePDF() { let v1 = UIView(frame: CGRectMake(0,0,100,100)) v1.backgroundColor = UIColor.redColor() let v2 = UIView(frame: CGRectMake(0,0,100,200)) v2.backgroundColor = UIColor.greenColor() let page1 = PDFPage.View(v1) let page2 = PDFPage.View(v2) let page3 = PDFPage.WhitePage(CGSizeMake(200, 100)) let page4 = PDFPage.Image(UIImage(contentsOfFile: "path/to/image1.png")!) let page5 = PDFPage.ImagePath("path/to/image2.png") let pages = [page1, page2, page3, page4, page5] let dst = NSHomeDirectory().stringByAppendingString("/sample1.pdf") do { try PDFGenerator.generate(pages, outputPath: dst) } catch (let e) { print(e) } } もちろん、従来通りの使い方もできます。…
-
autoreleasepoolから例外を投げられるようにする
Wednesday, February 10, 2016
最近ニッチな事しか投稿していない気がする。 何かおしゃれなUIが実現できるライブラリ!の方がウケが良いんだろうけれども..。 ライブラリの開発中に、 autoreleasepoolを使って、局所的にメモリの消費が増える部分を抑えたい しかしautoreleasepoolの内部で例外を扱う箇所がある autoreleasepool内で投げる例外を、autoreleasepoolの外に伝搬させて、外で処理をしたい という問題に直面したのですが、 do { autoreleasepool { try ~~~~~ // ★ } } catch (let e) { print(e) // ★の例外をここで処理したい } こうしたくても、autoreleasepoolに、throwsもしくはrethrowsが指定されていないので、これができません。 なので、 try autoreleasepool { try ~~~~~ // ★ } こんな感じでautoreleasepool内部の例外を伝搬させられるようにします。 public func autoreleasepool(@noescape code: () throws -> ()) rethrows { try { var error: ErrorType? autoreleasepool { do { try code() } catch (let e) { error = e } } if let error = error { throw error } }() } こんな感じで宣言してあげれば、…
-
Swiftのdo〜try〜catchとdeferの組み合わせ
Wednesday, February 10, 2016
現在PDFGeneratorの新規機能の追加だったり、より安全にPDFが出力できるように整えているのですが、 その中で、どうしても 例外 をdo〜try〜catchで処理しなくてはならなくて。 そんな時に、例えばPDFの描画を開始し、例外を返すかもしれないprocess()を実行するという流れがあった場合に、 do { UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) try process() UIGraphicsEndPDFContext() } catch (let error) { print(error) } 処理が成功する場合は、UIGraphicsEndPDFContext()が呼ばれるのですが、tryで例外がキャッチされた場合は、UIGraphicsEndPDFContext()がスキップされてしまいます。危ない… そうならないために、以下のアプローチをとります。 UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) do { try process() } catch (let error) { print(error) } UIGraphicsEndPDFContext() うーん、これでも間違ってはいないのですが、ちょっとスコープが広すぎる気がします。 そこで、deferを使って、doステートメントの中で収まるようにします。 deferは、そのスコープを抜けるときに中に書いた処理を実行してくれるものです。 今回のケースにはもってこいですね。 do { UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) defer { UIGraphicsEndPDFContext() } try process() } catch (let error) { print(error) } なんとなく、終了の処理を、process()より先に書くのは抵抗がありますが、 これで、tryで仮に例外がキャッチされて、catchステートメントに移行したとしても、UIGraphicsEndPDFContext()が呼ばれます。 流れとしては、 正常に処理される場合 UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) process() UIGraphicsEndPDFContext() 例外がキャッチされる場合…
-
文字列中の数字を全角/半角変換する
Wednesday, February 10, 2016
文字列中に潜む数字だけを、他の文字に影響を与えずに変換したかったので、 調べてコードにおこして、Stringの extension として実装してみました。 記事自体はさきにQiitaに投稿したのでそちらを。 記事 コード全文は、Gistに放り投げたので、そちらを参照くださいませ。 Gist これを使えば、ユーザーがTextField等で数値を入力したときに、全角数字/半角数字を気にせず、 let input = "000" if let number = Int(input.hankaku) { print("input :", number) } として数値に変換できるので助かりますね。 もしかするとNSScannerでうまい具合にできたかもですが、とりあえずこれで良しとします。。
-
UICollectionViewで、完全に表示されているcellのみを取得する
Sunday, February 7, 2016
UICollectionViewで取得する visibleCells のうち、“完全に"表示されているcellのみを抜き出してみます。 ここでの"完全に"は、cellが一切、スクロールの範囲外にはみ出ていないことを指します。 …
-
UICollectionViewのreloadData()直後に確実にvisibleCellsを取得したい
Sunday, February 7, 2016
UICollectionViewで、 reloadData() を呼んだ直後は、visibleCells()でCellがうまく取得できない場合があります。 …
-
UIView/UIImageをPDFに変換するライブラリ、PDFGeneratorを作成しました
Saturday, February 6, 2016
先日記事に書いた「UIViewをPDFファイルに変換する」の内容を、この休みを使ってライブラリ化して公開しました。 sgr-ksmt/PDFGenerator …
-
'hugo new'を便利にするスクリプト
Friday, February 5, 2016
hugo new post/hogehoge.mdと入力すると、content/post/hogehoge.mdとファイルが生成されますが、 これだと少し記事の管理が不便なので、 毎回post/と付けるのを省きたい markdownファイル名の前に日付を付けたい 生成したあと、markdownのファイル名がtitle要素に含まれてしまうので、これをslug要素に移動させたい の2点を解消するスクリプトを書いてみました。 …