将自定义UIButton样式应用于所有按钮

时间:2017-09-16 17:32:01

标签: ios swift uibutton appdelegate

我想从多个故事板中为我的所有viewcontrollers应用一些样式。我有很多viewcontrollers所以将样式应用到每个viewcontroller听起来相当愚蠢。我想尽可能以最代码精益的方式做到这一点。我想在AppDelegate文件中这样做,因为你也可以在那里改变你的导航控制器样式,但到目前为止还没有成功。甚至没有丝毫的方式。

所以有人知道我该怎么做吗?

我正在使用Swift作为应用程序。

必须应用以下样式原则: cornerRadiusshadowColorshadowOffsetshadowRadiusshadowOpacitymaskToBounds

5 个答案:

答案 0 :(得分:5)

UIComponents创建扩展名,以便添加常用样式。

UIButton

的情况类似
extension UIButton {
    open override func draw(_ rect: CGRect) {
        //provide custom style
        self.layer.cornerRadius = 10 
        self.layer.masksToBounds = true
    }
}

或创建UIButton的子类并提供您想要应用的所有样式,并确保您的按钮从自定义类扩展

   class MyButton : UIButton {
        override init(frame: CGRect) {
            super.init(frame: frame)
            setup()
        }

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

    private func setup() {
       self.layer.cornerRadius = 10
       self.layer.masksToBounds = true
   }

答案 1 :(得分:2)

您可以使用UIAppearance api,如下所示:

UIButton.appearance().layer.cornerRadius = 4
UIButton.appearance().layer.shadowColor = UIColor.white.cgColor
UIButton.appearance().layer.shadowOffset = CGSize(width: 2, height: 2)
UIButton.appearance().layer.shadowRadius = 5
UIButton.appearance().layer.shadowOpacity = 0.5
UIButton.appearance().layer.masksToBounds = true

通过使用它,应用程序中的每个UIButton都将这些视觉属性设置为您已定义的内容。

您可以在https://developer.apple.com/documentation/uikit/uiappearance

找到有关此API的更多信息

答案 2 :(得分:2)

您可以使用IBInspectable制作自定义类。所以你可以从UI更改。====>

class NSCustomButton: UIButton {

    @IBInspectable var borderColor: UIColor = UIColor.clear {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

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

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            self.clipsToBounds = true
            self.layer.masksToBounds = true
        }
    }

    @IBInspectable var cornerRadiusByHeight: Bool = false {
        didSet {
            layer.cornerRadius = self.frame.size.height/2
        }
    }

    @IBInspectable var roundButton: Bool = false {
        didSet {
            layer.cornerRadius = self.frame.size.width / 2
            self.clipsToBounds = true
            self.layer.masksToBounds = true
        }
    }


    @IBInspectable var shadowColor: UIColor = UIColor.clear {

        didSet {

            layer.shadowColor = shadowColor.cgColor
            layer.masksToBounds = false
        }
    }


    @IBInspectable var shadowOpacity: CGFloat = 0.0 {

        didSet {

            layer.shadowOpacity = Float(shadowOpacity.hashValue)
            layer.masksToBounds = false
        }
    }

    @IBInspectable var shadowRadius: CGFloat = 0.0 {

        didSet {

            layer.shadowOpacity = Float(shadowRadius.hashValue)
            layer.masksToBounds = false
        }
    }

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

}

答案 3 :(得分:1)

您可以定义一个类,然后将其设置为按钮并使用awakeFromNib()方法进行配置。

@IBOutlet weak var myButton: MyCustomButton!


class MyCustomButton : UIButton{
    override func awakeFromNib() {
        super.awakeFromNib()
        setTitleColor(UIColor.black, for: .normal)
        layer.cornerRadius = 6
        backgroundColor = UIColor.red
        layer.borderWidth = 0.5
        layer.borderColor = UIColor.VFGGray.cgColor
    }
}

这样,您所有的按钮都将具有相同的外观。 希望对您有帮助

答案 4 :(得分:0)

使用UIButton api a来保存按钮样式,然后将所有按钮符合它。