-
ライブラリ「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 …
-
UIViewをPDFファイルに変換する
Tuesday, February 2, 2016
Objective-Cで、UIImage複数枚→PDF ファイル生成をやったのですが、 それをSwiftで書き直すぞってなって、ひとまず UIView を複数なげてpdfを生成するクラスを作ってみました。 初めてUIGraphicsBeginPDF〜〜系を使いました! …
-
Dictionaryにvalueを投げてkey(keys)を取得する
Monday, February 1, 2016
通常はDictionaryにkeyを投げて対応するvalueを取得しますが、 valueを投げて対応するkey(keys)を取得してみます。 …
-
UICollectionViewで綺麗なグリッド表示をする
Sunday, January 31, 2016
せっかくの休日ということでだらだらしつつ、μライブラリの整理や作成をして過ごしました。 今回はUICollectionViewのレイアウト調整を簡単にするライブラリ(extension)の紹介です。 …