【问题标题】:Controlling Button Appearance Globally全局控制按钮外观
【发布时间】:2017-03-27 21:21:50
【问题描述】:

我一直在尝试控制项目中所有按钮的外观。我创建了一个扩展并将其放在一个 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 行时,我收到“来自类的多重继承”错误。

class DefaultSettingsVC: UIViewController, UITextFieldDelegate, ButtonStyle {

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

【问题讨论】:

  • 您的意思是要创建一个应该隐式应用styleButton() 的子类吗?
  • 我想是的,是的。但我不确定这是否是正确的做法。
  • 在回答您的问题之前,您能否提及您想要达到的目的究竟是什么?所以我可以确保我会提出一个有用的方法。
  • 我希望所有视图中的所有按钮都显示相同:圆角,周围有边框。

标签: swift swift3 uibutton formatting


【解决方案1】:

您不应该使用子类化来执行此操作。扩展是要走的路!如果您希望能够在不同的类中使用扩展,您应该尝试将它放在一个单独的文件中。由于您正在扩展 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
    }
}

我对其进行了一些调整,因此现在您可以设置所需的参数,以防您以后需要以不同的方式设置某些按钮的样式。在我看来,它更可重用,因此更有用。

【讨论】:

  • 这很好用!非常感谢你! (我很惊讶我不必在我的 ViewController 文件中的某处识别按钮扩展文件。它似乎知道。)大帮助,谢谢!
  • 不客气!这就是扩展的好处。由于您正在扩展 UIKitUIButton 类,因此每次创建 UIButton 时,您都可以使用扩展程序的方法和变量。
【解决方案2】:

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

  • 为应用程序中的所有 ViewController 创建一个自定义的 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()
    }
}

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

希望这会有所帮助。

【讨论】:

  • 谢谢!这是一个非常好的解决方案。我喜欢我不需要为每个按钮调用样式。谢谢!! :)
猜你喜欢
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多