【Swift】CustomViewをXibで作成してコードベースで利用する

こんにちは、しょーです。
普段はStroyBoardをあまり使用せず、コードベースでビューを作成しています。
だいたいはインスタンスを作成してSnapKitを使用すればそれなりに楽にできるのですが、
オブジェクトが混み合ってくるとレイアウトのコードが増えてきたりレイアウト自体が難しくなってきます。
そういった場合はXibでViewを作成してしまおう、のメモです。
基本的にカスタムセルを作成する際はXibを使用して作成するのですが、カスタムビューの作成には使用してきませんでした、というかやり方がわかりませんでした。
今回業務で凝ったビューを作成する機会があり、Xibが必要になったので実装してみました。
classファイルとXibファイルを作成する
classファイルの作成
はじめにClassファイルを作成します。
UIViewで作成すれば問題ありません。
後ほど使用するのでinitializerの作成しておきましょう。
import UIKit
final class SampleView: UIView {
init() {
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Xibファイルの作成
次にXibファイルを作成します。
カスタムクラス名と同名で大丈夫です。
そうすると初めはこのようなViewControllerのViewになっているかと思います。
こちらをUIView仕様に変更していきます。
下記のように、Simulated Metricsの
- size > Freedom
- Top Bar > None
- Bottom Bar > None
とし、希望の大きさに調整しましょう。
サイズをfreedomにすることにより任意のサイズに変更可能になり、Top/Bottom Bar を None にすることにより、ステータスバーなどを非表示にできます。
Xib を Custom Class に紐付ける
Xib を CustomClass に紐づける作業を行います。
最初に File's owner を先ほど作成したクラスファイルに紐付けます。
View の CustomClass は空欄で大丈夫です。
あとは作成したいViewをレイアウトしてください。
Xibを使用する処理をクラスに記述する
最後にXibをコードベースで使用するための処理をclassに記述します。
import UIKit
final class SampleView: UIView {
@IBOutlet weak var label: UILabel!
init() {
super.init(frame: .zero)
let view = UINib(nibName: "SampleView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView
view.frame = bounds
addSubview(view)
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
ベースの作成は以上になります。
Viewを使用する
試しに使って見るとこのような感じになります。
import UIKit
import SnapKit
final class ViewController: UIViewController {
private let sampleView = SampleView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(sampleView)
sampleView.snp.makeConstraints { make in
make.center.equalToSuperview()
make.width.height.equalTo(200)
}
}
}
終わりに
これで好きな場所でこのカスタムビューを使用できるようになります。
コードベースで作成している人はオブジェクトとSnapKitのレイアウトコードが増えてきたなぁとか、思うことがあると思います。
そういう場合はXibを活用して楽なレイアウトを試みましょう。
コードベースは楽ですけど、すべてやるのは逆に辛い!という学びでした。
以上だ!お疲れ!
じゃーな!
ディスカッション
コメント一覧
まだ、コメントがありません