2017-05-11 15 views
0

以下のスクリーンショットでは、ドロップダウンボタン(選択したビュー)がライブレンダリングされていないことに注意してください。また、IDインスペクタの「Designables Up To Date」に注意してください。最後に、アシスタントエディタの2つのブレークポイントに注意してください。エディタ - >選択したビューをデバッグすると、これらのブレークポイントが両方ともヒットします。IBBesignable UIButtonのサブクラスがInterface Builderでレンダリングされないのはなぜですか?

enter image description here

ここで私はそれを実行するときには次のようになります。

enter image description here

ここでは、コードです:

@IBDesignable 
class DropDownButton: UIButton { 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    initialize() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    initialize() 
} 

private func initialize() { 
    if image(for: .normal) == nil { 
     //setImage(#imageLiteral(resourceName: "DropDown"), for: .normal) 

     let bundle = Bundle(for: DropDownButton.self) 
     if let image = UIImage(named: "DropDown", in: bundle, compatibleWith: nil) { 
      setImage(image, for: .normal) // Editor -> Debug Selected Views reaches this statement 
     } 
    } 
    if title(for: .normal) == nil { 
     setTitle("DropDown", for: .normal) // Editor -> Debug Selected Views reaches this statement 
    } 
    addTarget(self, action: #selector(toggle), for: .touchUpInside) 
} 

override func layoutSubviews() { 

    super.layoutSubviews() 

    if var imageFrame = imageView?.frame, var labelFrame = titleLabel?.frame { 

     labelFrame.origin.x = contentEdgeInsets.left 
     imageFrame.origin.x = labelFrame.origin.x + labelFrame.width + 2 

     imageView?.frame = imageFrame 
     titleLabel?.frame = labelFrame 
    } 
} 

override func setTitle(_ title: String?, for state: UIControlState) { 
    super.setTitle(title, for: state) 
    sizeToFit() 
} 

public var collapsed: Bool { 
    return imageView?.transform == CGAffineTransform.identity 
} 

public var expanded: Bool { 
    return !collapsed 
} 

private func collapse() { 
    imageView?.transform = CGAffineTransform.identity 
} 

private func expand() { 
    imageView?.transform = CGAffineTransform(rotationAngle: .pi) 
} 

@objc private func toggle(_: UIButton) { 
    if collapsed { expand() } else { collapse() } 
} 
} 

まず編集:

私はprepareForInterfaceBuilderを追加しましたメソッドとして@ DonMagの答えごと。そうすることで改善が見られましたが、まだ間違っています。インタフェースビルダーはフレームについて混乱しているようです。ボタンを選択すると、画像(つまり三角形)ではなくタイトルのみが選択されます。私は国境を追加しました。それはタイトルとイメージの両方を回ります。ここでの画像です:

enter image description here

私は、新しい位置にすべてのものが移動し、タイトルや画像をボタンをドラッグした場合。

また、PrepForInterfaceBuilderが差をつけたことに私は驚きました。このメソッドの私の理解は、それは私にダミーデータを提供するなどのインターフェイスビルダーのみのセットアップを行うことができます。

+0

はこれを試してみてください。 - >自動的にビューを更新する - > すべてのビューを更新する – KKRocks

+0

IBのどこか他の場所で管理されているパラメータ(タイトル、画像など)を上書きすると、デザインビューに問題が発生します。 'UIButton'を設計可能な' UIView'でラップするとうまくいくはずです。 – Rob

答えて

0

これを追加します。編集メニュー:

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    initialize() 
} 
+0

Thx、それは正しい方向に私を向けるが、家はまだいない。私の編集内容を見てください。 – Verticon

関連する問題