20

何を言っているのかわからない人のために説明すると、Xcode 6.0 には新しい機能 IBDesignable と IBInspectable が追加されました。

カスタム ビューに IBInspectable プロパティのタグを付けると、それらのプロパティが IB の属性インスペクターに表示されます。

同様に、カスタム UIView サブクラスに IBDesignable のタグを付けると、Xcode はビューをコンパイルし、コードを呼び出してビュー オブジェクトを Xcode ウィンドウで直接レンダリングするので、それらがどのように見えるかを確認できます。

IBDesignable および IBInspectable 属性をカスタム ビューに追加する手法は、Swift と Objective-C でほとんど同じです。IBInspectable プロパティは、定義に使用する言語に関係なく、Interface Builder Attributes Inspector に表示されます。

Objective-C で UIView のカテゴリを作成し、Swift で UIView の拡張を作成しました。これらは、ビューの基本レイヤーの borderWidth、cornerRadius、borderColor、および layerBackgroundColor プロパティをビューのプロパティとして昇格させます。プロパティを変更すると、拡張子/カテゴリは必要に応じて型変換を行い、変更をレイヤーに転送します。

IBInspectable 部分はうまく機能します。IB 属性インスペクタに新しいプロパティが表示され、設定できます。

先週、ビュー カテゴリ/拡張機能の IBDesignable 属性も機能しており、変更されたレイヤー属性を使用してカスタム UIView カテゴリが IB でレンダリングされていることを確認できました。今週は機能していません。

私は幻覚でしたか?

既存のシステム クラスのカテゴリ/拡張は、IBDesignable でセットアップされている場合、Interface Builder でカスタム UI を描画できますか?

4

5 に答える 5

26

この質問を投稿して以来、 @IBDesignable はクラス拡張では機能しないことを知りました。タグを追加できますが、効果はありません。

于 2015-11-08T12:49:33.547 に答える
1

ビューコントローラーのトップビューとして設定した@IBDesignable UIViewを1つ持つことで、ユースケースでこれを機能させました。私の特定の使用例は、 ClassyKit スタイリングをデフォルト UIKit ビューの Interface Builder で表示できるようにすることであり、そのためだけにサブクラス化する必要はなく、うまく機能しています。

設定方法の例を次に示します。

// in Interface Builder set the class of your top view controller view to this
@IBDesignable class DesignableView: UIView {
}

extension UIView {
    open override func prepareForInterfaceBuilder() {
        subviews.forEach {
            $0.prepareForInterfaceBuilder()
        }
    }
}

extension UILabel {
// just an example of doing something
    open override func prepareForInterfaceBuilder() {
        layer.cornerRadius = 8
        layer.masksToBounds = true
        backgroundColor = .red
        textColor = .green
    }
}
于 2016-10-29T16:42:57.903 に答える