HenPitsu 4.0 – Swift 3.0で書き直し

今年の正月は実家に帰省せず自宅にいました。大晦日にランニングしたところ数日筋肉痛がひどく自宅からなかなか出られなかったこともありSwiftが3.0になってどのような変更があったのかをみていました。
[iOS 10] UIGraphicsImageRenderer について というのが見通しの良いコードが描けそうなので、HenPitsuをSwiftで書き直してみることにしました。

一番の変更点は、背景の写真と文字のレイヤーを分けて、表示・エクスポート時に合成するようにすることです。これにより、後から自分の書いた画だけあるいは背景だけ消したりすることが出来るようになりました。さらにはこれまでおざなりにしていた書き味の細かいチューニングもやってみました。

一部でバグを見つけたり、今でも何故動くのかわからない部分もありながらなんとか完成しました。あと、AppleがiADから撤退したせいでアプリからの広告収入がなくなっていたのですが、GoogleのAdMobをCocoapods経由で組み込んでみました。

ということでver4.0ができたのですが、UIGraphicsImageRendererを使うにはそのためだけに対応OSがver10以上となってしまいます。ver9.0以上で動くようにするために自力で擬似的なものを作ってみました。本当は内部バッファを自分で確保して内部ではcgImageを保持して必要なときにUIImageを生成するようにしてみたのですが、座標軸が上下反転する問題に巻き込まれてかえってややこしくなってしまったので、馬鹿みたいに簡単なものになりました。指定通りのサイズのビットマップを作るのか、Retina対応でスケール対応したビットマップを作るのかで関数を変えています。

なお起動に時間がかかるようになったのはAdMobのせいだと思います。

< SNGraphicsImageRenderer.swift >
import UIKit
class SNGraphicsImageRenderer{
    var sz:CGSize
    init(size: CGSize){
        sz = size
    }
    func image(actions: (CGContext) -> Void) -> UIImage?{
        UIGraphicsBeginImageContext(sz)
        if let con = UIGraphicsGetCurrentContext(){
            actions(con)
            let img = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return img
        }
        return nil
    }
    
    func imageScaled(actions: (CGContext) -> Void) -> UIImage?{
        UIGraphicsBeginImageContextWithOptions(sz, false, 0.0)
        if let con = UIGraphicsGetCurrentContext(){
            actions(con)
            let img = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return img
        }
        return nil
    }
}
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中