コードレイアウトで肥大化したViewのファイルを圧縮する

現在とあるアプリの受託開発をしております。 Objc -> Swiftの移行と共にプロジェクトからIBを無くしたいとのことです。

そこでstoryboardにあるものをコード化しているのですが、作成するViewのファイルがどうしても肥大化してしまいます。

ある程度はしょうがないと思うのですが、少しくらいは改善に務めてみようと思いました。


500行のファイルが200行になりました。 何を当たり前のことをいってるんだと思われるかもしれませんが、 Viewファイルの見通しがよくなったので個人的に満足したという記事です。もちろんプロジェクト自体のコードは増えますが・・・


① addSubViewsの追加。

addSubViews(view1, view2, view3, view4, view5, view6, view7)

②UIクラスのイニシャライザを追加

static func 'default'(imageName: "") -> UIImageView {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.image = UIImage(named: imageName)
    return v
}

before

private lazy var imageView: UIImageView = {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.image = UIImage(named: "")
    return v
}()

after

private var imageView = UIImageView.default(imageName: "file")

translatesAutoresizingMaskIntoConstraintsなど毎回書く処理も多いので。今まではこの程度と思ってたけど使ってみると普通に便利です。

③ オートレイアウト

オートレイアウトのコードが非常に多いと思いました。 現在SnapKitを使っています。

before

textField.snp.remakeConstraints { (make) in
    make.width.equalTo(250)
    make.height.equalTo(45)
    make.top.equalTo(145)
    make.centerX.equalToSuperview()
}

各Viewに制約を付ける際改行込みでみで最大7行が追加されてしいます。 これをもう少し減らしたいと思いショートカットを作成しました。

after

textField.snpex
    .constrainX(left: label.snp.right + 10), right: imageView.snp.left)
    .constrainY(top: label.snp.top, height: 45)

コード量も減りましたが、X軸Y軸と順番にコードを書くのを強制することで制約のつけ忘れや重複がなくなるといった利点もありました。

というか1時間くらいで適当に作ってみました。上記は問題ないですが.equalToSuperViewにも対応したいです。 swift-snippet/Library/ExSnapKit at master · churabou/swift-snippet · GitHub

後日メソッドチェーン でオートレウアウトをかけるExtensionを作成しました。

github.com