以下のスクリーンショットでは、ドロップダウンボタン(選択したビュー)がライブレンダリングされていないことに注意してください。また、IDインスペクタの「Designables Up To Date」に注意してください。最後に、アシスタントエディタの2つのブレークポイントに注意してください。エディタ - >選択したビューをデバッグすると、これらのブレークポイントが両方ともヒットします。IBBesignable UIButtonのサブクラスがInterface Builderでレンダリングされないのはなぜですか?
ここで私はそれを実行するときには次のようになります。
ここでは、コードです:
@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の答えごと。そうすることで改善が見られましたが、まだ間違っています。インタフェースビルダーはフレームについて混乱しているようです。ボタンを選択すると、画像(つまり三角形)ではなくタイトルのみが選択されます。私は国境を追加しました。それはタイトルとイメージの両方を回ります。ここでの画像です:
私は、新しい位置にすべてのものが移動し、タイトルや画像をボタンをドラッグした場合。
また、PrepForInterfaceBuilderが差をつけたことに私は驚きました。このメソッドの私の理解は、それは私にダミーデータを提供するなどのインターフェイスビルダーのみのセットアップを行うことができます。
はこれを試してみてください。 - >自動的にビューを更新する - > すべてのビューを更新する – KKRocks
IBのどこか他の場所で管理されているパラメータ(タイトル、画像など)を上書きすると、デザインビューに問題が発生します。 'UIButton'を設計可能な' UIView'でラップするとうまくいくはずです。 – Rob