【问题标题】:Why Is My IBDesignable UIButton Subclass Not Rendering In Interface Builder?为什么我的 IBDesignable UIButton 子类没有在 Interface Builder 中呈现?
【发布时间】:2017-05-11 18:03:37
【问题描述】:

请注意,在下面的屏幕截图中,DropDownButton(选定的视图)没有被实时渲染。此外,请注意身份检查器中的“Designables Up To Date”。最后,请注意助手编辑器中的两个断点:如果我执行 Editor -> Debug Selected Views 那么这两个断点都会被命中。

这是我运行它时的样子:

代码如下:

@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() }
}
}

第一次编辑:

我根据@DonMag 的回答添加了 prepareForInterfaceBuilder 方法。这样做有所改进,但仍然有问题:界面生成器似乎对框架感到困惑。当我选择按钮时,只选择了标题,而不是图像(即三角形)。我添加了一个边框;它围绕标题和图像。这是一张图片:

如果我将按钮拖到一个新位置,那么一切都会移动,包括标题和图像。

此外,prepareForInterfaceBuilder 的作用让我感到惊讶。我对这种方法的理解是它允许我只进行界面构建器设置,例如提供虚拟数据。

【问题讨论】:

  • 试试这个:编辑器菜单。 ->自动刷新视图->刷新所有视图
  • 如果您要覆盖 IB 中其他地方控制的参数(例如标题、图像等),可设计视图会遇到麻烦。如果您将UIButton 包装在可设计的UIView 中,它应该可以正常工作。

标签: ios swift3 xcode8


【解决方案1】:

添加这个:

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

【讨论】:

  • 谢谢,我正朝着正确的方向前进,但还没有回家。请查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多