UIViewを継承したカスタムクラスを自作する方法

今日は、自作バナー広告をUIViewを継承したカスタムクラス(AdBannerView)で実装する方法を紹介。
まーまずXibファイルAdBannerView.xibそれに対応するカスタムクラスAdBannerView.swiftを作成。

Xibファイルの作成

Xibファイルの設定はこんな感じ。

下記図のように適当なViewをIBで作って、その Placeholders -> File’s Owner にAddBannerViewのカスタムクラスを設定してやる。

スクリーンショット 2016-02-04 8.56.22

カスタムクラスの作成

Swiftで書いたコードはこんな感じ。

AdBannerView.swift

ちょっと補足すると、ここで登場する

  1. init(frame: CGRect)
  2. init(coder aDecoder: NSCoder)

の2つのイニシャライザー。

僕は今まで知らなかったのですが、このカスタムクラスがコールされる方法によって使い分けられているイニシャライザらしく、前者はコードから直接コールされた場合、後者はInterfaceBuilder(以下、IB)上でコールされた場合に通るイニシャライザらしい!

初めて知りましたw

そう考えると、「なるほどなるほど!」となるのが、前者にはframeをセットする機構になっているのに対し、後者にはない。そらそうや、だってIB上でframeは決められるんやから。

まーどちらからコールされても対応できるように、イメージのセットなど、イニシャライザ内で行いたい処理を他の内部メソッド(上記例ではxibImgSet())で実装して、両イニシャライザでその内部メソッドをコールしてやる。

するとこのカスタムクラスをIB上で呼んでも、コード上で呼んでも大丈夫!ってわけ。

IB上でカスタムクラスのコール

ここまで理解したら、AdBannerViewを設置したいStoryboard上でUIViewを設置して、そのカスタムクラスをAdBannerViewに設定。

スクリーンショット 2016-02-04 8.56.44

これで完了。超簡単。素晴らしい!

注意

なお、一つだけ注意点があって、AdBannerView.xibの設定で Placeholders -> File’s Owner すべし!と書きましたが、間違えてXibファイル内のViewにそのカスタムクラスを設定してしまうと、このカスタムクラスがコールされた場合に自己を参照してしまうという無限ループに陥って、 が待っています。今回のコードの例だとcheckが出力されまくって力尽きて落ちますw

だから 間違っても下記図のCustom Class -> Classに「AdBannerView」と設定しないように!

スクリーンショット 2016-02-04 8.56.11