先日の勉強会の間に、PDFGeneratorをv1.1.1にアップデートしました!という事後報告を。
こんなに継続して開発してるのは初めてですし、使ってくれてる人が居て、issue をくれる人がいるというのは、 本当に感謝しないとなあと思っています。

今回は1.1→1.1.1へのマイナーアップデートです。

何を修正したのか


今回は、 issue/13 の内容を修正した形になります。具体的には、

  • UITableView(おそらくUIScrollView,UICollectionViewでも)で、 contentInset が設定されていると、上手く描画されない
    (section headerとかの位置がinset分ズレたりする)

といったものでした。最初普通にUITableViewControllerを作って試したものの再現できず、 contentOffset をいじっても再現できずで、
たまたま contentInset をいじったら再現が取れて、、と、再現までに時間がかかってしまいました><

どう修正したか


UIScrollViewを描画する前に、一度 frame の *origin*の値、 contentOffset の値を0にリセットをかけるので、それと併せて contentInset もリセットをかけるようにしました。

まずはこんな感じで、UIScrollViewにprivateな extension を用意して、、

private extension UIScrollView {
    typealias TempInfo = (frame: CGRect, offset: CGPoint, inset: UIEdgeInsets)

    var tempInfo: TempInfo {
        return (self.frame,self.contentOffset,self.contentInset)
    }

    func resetInfoForRender() {
        self.contentOffset = CGPointZero
        self.contentInset = UIEdgeInsetsZero
        self.frame = CGRect(origin: CGPointZero, size: self.contentSize)
    }

    func restoreFromInfo(info: TempInfo) {
        self.frame = info.frame
        self.contentOffset = info.offset
        self.contentInset = info.inset
    }

}

必要なプロパティの値をtempに起こしたり、tempから復元したりする処理を用意してあげます。
これくらいの情報量なので、temp用の struct は用意しないで、 Tuple で間に合わせました。
あとは、これを使ってあげる感じです。

    let tmp = scrollView.tempInfo // temp情報書き出し
    scrollView.resetInfoForRender()
    UIGraphicsBeginPDFPageWithInfo(scrollView.frame, nil)
    scrollView.layer.renderInContext(context)
    scrollView.restoreFromInfo(tmp) // temp情報から復元

これだけのためにextensionを用意するのは、、と思いますが、処理としてはスッキリまとまるので見通しは良いかなと思います。

これからも


issueがあったら改善に取り組みたいですし、きたるSwift2.2、3.0で修正や、よりよく書く方法があればそれに追従して新しくしていけたらと思います。頑張ります。
もしPDFをアプリで作るんだーって時は使ってみてください。issueもPRもお待ちしています。