#問題
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
以上です。もっと良い方法や, 問題点ありましたら, コメントいただけると嬉しいです!