LoginSignup
2

More than 1 year has passed since last update.

CustomViewをコードで実装する

Last updated at Posted at 2020-11-13

はじめに

CustomViewをコードで実装した際に、initメソッドに関しての理解が曖昧でしたので備忘録として投稿します。

動作環境

【Xcode】Version 12.0.1
【Swift】Version 5.3

実装コード

CustomView.swift
import UIKit

class CustomView: UIView {

    var imageView: UIImageView!

    // 詳細説明①
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    // 詳細説明②
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    private func setup(){
        let iWidth: CGFloat = 200
        let iHeight: CGFloat = 200
        let posX: CGFloat = (self.frame.width - iWidth)/2
        let posY: CGFloat = (self.frame.height - iHeight)/2

        imageView = UIImageView(frame: CGRect(x: posX, y: posY, width: iWidth, height: iHeight))
        imageView.image = UIImage(named: "hoge")
        self.addSubview(imageView)
    }

}
ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let customView = CustomView()
        customView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
        self.view.addSubview(customView)
    }
}

詳細説明①

override init(frame: CGRect) {
    super.init(frame: frame)
}
  • 通常のイニシャライザ(requiredが付かないイニシャライザ)はサブクラスで実装しても実装しなくても良いが、初期化などを行う場合はoverrideを必ず付ける必要があります。

詳細説明②

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
  • 必須のイニシャライザ(requiredが付いてるイニシャライザ)はサブクラスで絶対に実装しないといけません。
  • init?(coder aDecoder: NSCoder)のイニシャライザはNSCodingプロトコルで定義されており、それがUIViewクラスで実装されているので、サブクラスでも実装する必要があるということになります。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2