全局控制按钮外观

时间:2017-03-27 21:21:50

标签: swift swift3 uibutton formatting

我一直试图控制项目中所有按钮的外观。我创建了一个扩展并将其放在一个ViewController文件的顶部,以控制该视图中所有按钮的外观。它很棒。这是:

    import UIKit

    // EXTENSION TO CONTROL BUTTON APPEARANCE
    extension UIButton {
        func styleButton() {
            self.layer.cornerRadius = 8
            self.layer.borderWidth = 2
            self.layer.borderColor = UIColor.red.cgColor
        }
    }

    class DefaultSettingsVC: UIViewController, UITextFieldDelegate {
    ...
    // IN VIEWDIDLOAD :
         myButton1.styleButton()
         myButton2.styleButton()  //etc.

唯一的问题是我需要将它放在每个ViewController文件的顶部。 (我希望我在这里使用正确的术语。)所以不是那样,我想我会创建一个全新的文件,它是UIButton的子类。这是整个文件的内容:

import UIKit

class ButtonStyle: UIButton {
    func styleButton() {
        self.layer.cornerRadius = 8
        self.layer.borderWidth = 2
        self.layer.borderColor = UIColor.red.cgColor
    }
}

但现在呢?!当我尝试将它添加到我的ViewController文件中的类行时,我得到了一个"来自类的多重继承"错误。

class DefaultSettingsVC: UIViewController, UITextFieldDelegate, ButtonStyle {

我在这里走错了路吗?我应该以完全不同的方式做这件事吗?任何帮助都会很棒。我的Swift专业知识只有2.5分(满分5分),所以我还在学习,如果可以,我会很感激。

2 个答案:

答案 0 :(得分:2)

您不应该使用子类来执行此操作。扩展是要走的路!如果您希望能够在不同的类中使用扩展,则应尝试将其放在单独的文件中。由于您要扩展UIButton类,因此您希望可以从任何地方访问它。

请参阅ViewController课程:

class MyViewController: UIViewController {

    var button = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()
        button.styleButton(cornerRadius: 8, borderWidth: 2, borderColor: UIColor.red.cgColor)
    }
}

您的扩展程序文件:

extension UIButton {
    func styleButton(cornerRadius: CGFloat, borderWidth: CGFloat, borderColor: CGColor) {
        self.layer.cornerRadius = cornerRadius
        self.layer.borderWidth = borderWidth
        self.layer.borderColor = borderColor
    }
}

我稍微调整了一下,所以现在你可以设置你想要的参数,以防你以后需要以不同方式设置一些按钮。在我看来,它更具有可重用性,因此更有用。

答案 1 :(得分:0)

我建议通过以下方式为所有ViewControllers中的所有按钮应用所需的样式:

  • 为应用程序中的所有ViewControllers创建自定义UIViewController超类。

  • 让超类处理其视图中所有按钮的所需样式的应用。

超类应该类似于:

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        setupButtonsStyle()
    }

    func setupButtonsStyle() {
        for subview in view.allSubViews.filter({$0 is UIButton}) {
            let button = subview as! UIButton
            button.layer.cornerRadius = 8
            button.layer.borderWidth = 2
            button.layer.borderColor = UIColor.red.cgColor
        }
    }
}

extension UIView {
    var allSubViews : [UIView] {
        var array = [self.subviews].flatMap {$0}
        array.forEach { array.append(contentsOf: $0.allSubViews) }

        return array
    }
}

请注意,声明allSubViews的目的是在视图中获取所有视图及其子视图。

确保子类viewDidLoad()方法包含super.viewDidLoad()

class ViewController: BaseViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

这种方法可以节省为应用程序中的每个按钮调用样式方法的时间(您不必为每个按钮手动调用button.styleButton),所有您需要做的就是让期望ViewController作为超类的子类。

希望这会有所帮助。