在Interface Builder中无法正确显示自定义按钮

时间:2018-01-16 12:02:01

标签: ios swift interface-builder

我正在学习在XCode中开发iOS应用程序。 我创建了简单的自定义按钮(UIButton的子类),它应该有红色背景和绿色文本。在iOS模拟器中运行应用程序时,一切正常。但是在界面构建器中使用了其他颜色(在界面构建器中指定)。测试项目位于https://www.dropbox.com/s/ro7i4omdbpwapi0/testapp%20%282%29.zip?dl=0。有人可以帮忙吗?

以下是自定义UI按钮类的源代码:

import UIKit

@IBDesignable class DefaultButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setup()
    }

    func setup() {
        setTitleColor(UIColor.red, for: .normal)
        backgroundColor = UIColor.green
        //setBackgroundImage(UIImage.createGradient(colors:  [ UIColor.defaultGradientStartColor, UIColor.defaultGradientEndColor ], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 1, y: 0), size: CGSize(width: 200, height: 200)), for: .normal)
        //layer.cornerRadius = 50
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        setup()
    }
}

1 个答案:

答案 0 :(得分:0)

你回答的行为是正确的;但我觉得你混合了两件不同的东西。

基本上,如果要为按钮标题和按钮背景着色,则必须使用界面构建器中的可用字段。你有一些很好的属性来轻松地设置这些东西。

Use interface builder's parameters to design your look

因此,在这种情况下,在视图设置中定义 titleColor backgroundColor 是不相关的,因为它是硬编码的。

如果您希望在故事板中为按钮显示自定义外观(如圆角),则可以使用 @IBInspectable 关键字在界面构建器中添加新属性。

@IBDesignable
class DefaultButton: UIButton {

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }
    @IBInspectable var borderColor: UIColor? {
        didSet {
            layer.borderColor = borderColor?.cgColor
        }
    }
    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }

    // ...
}

通过这样做,您可以在故事板中使用漂亮的渲染来编辑和查看视图!

Custom properties directly in storyboard