使用@ IBDesigable / @ IBInspectable在故事板中的按钮上不显示转角半径

时间:2016-04-21 03:33:42

标签: swift uibutton uistoryboard ibdesignable ibinspectable

我有一个按钮的自定义类。

import UIKit

@IBDesignable
class CustomButton: UIButton {

    @IBInspectable var cornerRadiusValue: CGFloat = 10.0 {
        didSet {
            setUpView()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.layer.cornerRadius = 10.0
    }

    override func awakeFromNib() {
        setUpView()
    }

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

    func setUpView() {
        self.layer.cornerRadius = 10.0
    }

}

但是,角色半径未显示在故事板中的按钮上。

我理解@IBInspectable只允许您更改检查器面板中的值。我想这不是我想要的。

当我创建一个具有该类的按钮时,我希望在角逐板中显示角半径。我认为这是@IBDesignable的作用。

3 个答案:

答案 0 :(得分:10)

您的代码在IB中崩溃,因此可设计性失败。这是更简单的代码:

drawContours()

现在按钮既可检测又可设计:

enter image description here

它也适用于正在运行的应用程序。

答案 1 :(得分:2)

试试这个:

@IBDesignable
class CustomButton: UIButton {

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

}

答案 2 :(得分:0)

这是比接受的答案更好的解决方案:

@IBDesignable
class DesignableButton: UIButton {

    @IBInspectable private var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.masksToBounds = newValue > 0
            layer.cornerRadius = newValue
        }
    }

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

}

它使用计算所得的属性来避免与存储的属性重复状态。