問題
carthageを使っている方だったら馴染みのある話かもしれないですが, フレームワークのヘッダファイルから @IBDesignable @IBInspectable の情報が抜け落ちてしまっているらしく, フレームワーク側で@IBDesignable @IBInspectable に対応していてもその利用者側からは使うことができません。
抜け落ちてしまうのはどうしようもないみたいですが, 対策として利用可能にする方法を調べました。
対策
フレームワーク利用者側からできる対策と, フレームワーク実装者側からできる対策がそれぞれ見つかりました。
1.該当クラスを継承して対応する(フレームワーク利用者側)
まず, @IB~ に対応しているフレームワーク内のクラスを継承したクラスを自分のプロジェクトに追加する。
@IBDesignableへの対応
そのクラスに @IBDesignable をつけるだけ。
@IBInspectableへの対応
@IBInspectable が使える変数のgetter/setterとなるcomputed propertyを追加し, @IBInspectable をつける。
参考サイトからの引用ですが, こんな感じです。
@IBDesignable
class MyCustomView: CustomView {
@IBInspectable override var bgColor: NSColor {
get {
return super.bgColor
}
set {
super.bgColor = newValue
}
}
}
参考・引用元:https://github.com/Carthage/Carthage/issues/335#issuecomment-223761898
2.実装クラスをヘッダに含めて対応する(フレームワーク開発者側)
Materialというライブラリが @IB~ に対応しており, どうやっているのか調べたところ, フレームワークのプロジェクトの
Target -> Build Phases -> Headers -> Public
に実装ファイル(*.swift)を追加していました。
これで良いのだろうかという疑問はありますが, 手元のフレームワークのプロジェクトでも @IBInspectable を利用することができました。
※追記(2016/7/21)
ちゃんとやるんであれば, 面倒ですがインターフェースだけを定義したクラスを別で作ってHeadersに追加したほうが良いかもしれないです。ちなみにprotocolに@IB~をつけるのはできませんでした。
ただ, @IBDesignable の方はIB上で Build Failed となってしまい利用できず。。こちらは引き続き調べてみます。
参考元(Material):https://github.com/CosmicMind/Material
以上です。もっと良い方法や, 問題点ありましたら, コメントいただけると嬉しいです!