简体   繁体   中英

Change UILabel's textColor in whole app using Swift

Is there any way in Swift i can change my UILabel's text color property at once in whole app? I've tried using appeareance property but that doesn't work for UILabel textColor. Any way or any library that works on the same.

One way is using Color Set .

Start with creating new set in your xcassets catalog

在此处输入图片说明

... and name it how you want to

在此处输入图片说明

Then change your color to color that you need

在此处输入图片说明

Finally, set color of your label as this color from xcassets catalog

在此处输入图片说明 在此处输入图片说明

... or programmatically

label.textColor = UIColor(named: "ColorForLabel")

Now when you need to change color of text, just change color of this Color Set

在你的AppDelegate.swift里面didFinishLaunchingWithOptions函数中试试这个:

UILabel.appearance(whenContainedInInstancesOf: [UIView.self]).textColor = .red //or what color you want

Create a UILabel class and set the textColour in that class to your desired colour. And give this class to all the labels you are using in the app. If you want to change the colour of all labels during the session, say by button action, you can use NotificationCenter and Singleton for that purpose.

class LabelColor {
    static let shared = LabelColor()
    var color = UIColor.red
}

class ColoredLabel: UILabel {

    override func awakeFromNib() {
        super.awakeFromNib()
        textColor = LabelColor.shared.color
        NotificationCenter.default.addObserver(self, selector: #selector(self.changeColor(notification:)), name: Notification.Name(rawValue: "ChangeColor"), object: nil)
    }

    @objc func changeColor(notification: Notification) {
        let newColor = UIColor.blue
        textColor = newColor
        LabelColor.shared.color = newColor
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func changeColour(_ sender: UIButton) {
        NotificationCenter.default.post(name: Notification.Name("ChangeColor"), object: nil)
    }
}

故事板

I really liked Arash Etemad's solution , but found it quite extreme as it overrode ALL colours, even if some of them were customised. That's not great when working on an existing large project.

So I came up with this (Swift 5.2):

extension UILabel {

    override open func willMove(toSuperview newSuperview: UIView?) {
        super.willMove(toSuperview: newSuperview)

        guard newSuperview != nil else {
            return
        }

        if #available(iOS 13.0, *) {
            if textColor == UIColor.label {
                textColor = .red
            }
        } else if textColor == UIColor.darkText {
            textColor = .red
        }
    }    
}

It uses the labels own lifecycle event to override default system font colour. With the appearance of dark mode in iOS 13, that can be identified as UIColor.label , whereas before it's UIColor.darkText .

This prevents a custom font colour from being overriden (unless your custom colour is the same as the default ?!? ), whilst not requiring to manually set font colour all over the project.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM