2017-06-06 2 views
0

私はストーリーボードで使用できるようにIBDesignableとしてマークされたカスタムuiクラスを作成したいと仮定します。デフォルト値をオーバーライドすることは可能ですストーリーボードでオーバーライドすることはできますか?インターフェイスビルダー/ストーリーボードでオーバーライドできるデフォルトプロパティのデフォルト値を変更

たとえば、カスタムUILabelを作成したい場合、デフォルトのbackgroundColorをredにオーバーライドして、ストーリーボードのビューに追加するたびに、デフォルトでは赤の背景色になります白が普通ですが)、私がストーリーボードの何かに色を変えると、その新しい色を保ちます。

backgroundColorのプロキシとして特定のIBInspectableプロパティを追加することはできますが、これは最適なものではないため、同じもの(backgroundColor)を制御するオブジェクトの2つのプロパティを残してしまうためです。

誰でもこれを行う方法を知っていますか?

答えて

1

外観プロキシを使用してこれを行うことができます。カスタムサブクラスのカスタムデフォルトを提供するように特別に設計されています。

ストーリーボードをロードする前に、外観プロキシを呼び出す必要があります。これを行う1つの方法は、initializeクラスメソッドを使用することです。

class MyCustomLabel: UILabel 
{ 
    override class func initialize() { 
     if (self === MyCustomLabel.self) { 
      MyCustomLabel.appearance().backgroundColor = .red 
     } 
    } 
} 

すべてのプロパティが外観プロキシに参加できるわけではありません。 Objective-CヘッダーのUI_APPEARANCE_SELECTORマクロでタグ付けできるもの。クラスのObjective-Cのヘッダを表示するための一つの方法は、このデフォルト色をレンダリングするために

// Copy this comment in you code an click on this: UIView 

(...これは実際にはおそらくバグです)コメント内のクラス名にコマンドをクリックすることですそれは正しく背景をレンダリングしますが、色のドロップダウンメニューはまだ「デフォルト」の色を表示すること

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    if (self.backgroundColor == nil) { 
     self.backgroundColor = .red 
    } 
} 

注:インターフェイスビルダー、あなたはそうのようなprepareForInterfaceBuilderメソッドを使用することができます。

+0

これは実際には動作しているようですが、初期化についての警告はSwiftによって呼び出されることが保証されていないため、おそらく将来的な解決策ではありません。しかし、もっと悪いのは、ストーリーボードに新しいデフォルトの色が表示されないということです。これは、私がこの全部をしたい理由の一種です。 – SveinnV

+0

申し訳ありませんが、インターフェイスビルダがデフォルトの色をどのようにピックアップするように指示できますか多分それは可能です... 'initialize'については、あなたが正しいです、これはObjective-Cのことであり、Swiftでは動作が異なるかもしれません。 'application(_:didFinishLaunchingWithOptions)'にコールしてください。遅すぎる場合は、 'AppDelegate'初期化子に入れてください。 – deadbeef

+0

@SveinnV私の編集を参照してください – deadbeef

関連する問題