4

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

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 所做的。

4

3 回答 3

13

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

@IBDesignable
class CustomButton: UIButton {
    @IBInspectable var cornerRadiusValue: CGFloat = 10.0 {
        didSet {
            setUpView()
        }
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        setUpView()
    }
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setUpView()
    }
    func setUpView() {
        self.layer.cornerRadius = self.cornerRadiusValue
        self.clipsToBounds = true
    }
}

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

在此处输入图像描述

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

于 2016-04-21T05:21:03.850 回答
2

试试这个:

@IBDesignable
class CustomButton: UIButton {

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

}
于 2017-02-13T12:23:05.627 回答
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()
    }

}

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

于 2019-12-28T21:01:42.380 回答