@IBDesignable UIButton扩展

10

我正尝试通过添加cornerRadius属性来扩展UIButton类,该属性可以在设计时更改而无需构建应用程序。 我正在使用以下扩展类:

import UIKit

@IBDesignable
extension UIButton {

    @IBInspectable var cornerRadius :CGFloat {

        get {
            return layer.cornerRadius
        }

        set {

            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

}

当我在Storyboard中更改cornerRadius属性时,我没有看到实时更改!我有什么遗漏吗?

2个回答

18

扩展不遵循IBDesignable限定符。只有实际的子类才会这样做。令人烦恼但却是真实的。


1
也许在未来我们会得到那个功能!但现在有点糟糕 :( - john doe

-7

尝试这段代码:

@IBDesignable extension UIView {
     @IBInspectable var borderColor:UIColor? {
            set {
                layer.borderColor = newValue!.CGColor
            }
            get {
                if let color = layer.borderColor {
                    return UIColor(CGColor:color)
                }
                else {
                    return nil
                }
            }
        }
    }

这将在运行时显示效果


1
“这将在运行时显示效果”是什么意思? @IBDesignable@IBInspectable是接口生成器的钩子。它们在运行时无关紧要。 - vikingosegundo
边框颜色在Storyboard或NIB中不会显示,只有在应用程序运行时才会显示。 - Gaurav Patel
只是想要更加清晰明了,虽然你的代码在运行时可以工作,但问题是关于 @IBDesignable@IBInspectable,它们用于标记视图和属性,然后您可以通过 Interface Builder 在设计时间与之交互。不幸的是,当添加到扩展中时,Interface Builder 不会识别这些属性。换句话说,在您的代码示例中,@IBDesignable@IBInspectable 实际上并没有起到任何作用。如果您将它们删除,或者更准确地说,在 Interface Builder 中不起作用。明白了吗? - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接