【问题标题】:Change UILabel's textColor in whole app using Swift使用 Swift 在整个应用程序中更改 UILabel 文本颜色
【发布时间】:2019-01-05 11:14:10
【问题描述】:

在 Swift 中有什么方法可以在整个应用程序中一次更改我的 UILabel 的文本颜色属性吗?我尝试过使用外观属性,但这不适用于 UILabel textColor。任何方式或任何库都可以使用。

【问题讨论】:

  • 使用 appearance 仅适用于新创建的标签,不适用于现有标签。

标签: ios swift uilabel


【解决方案1】:

一种方法是使用颜色集

从在您的 xcassets 目录中创建新集开始

...并按您的意愿命名

然后将颜色更改为您需要的颜色

最后,将标签的颜色设置为 xcassets 目录中的颜色

...或以编程方式

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

现在当你需要改变文字的颜色时,只需改变这个Color Set的颜色

【讨论】:

  • 不错的解决方案,但我认为这是定义颜色的通用方法,也不是所有UILabels 的确切解决方案。因为他必须为每个标签重新设置颜色
  • 在 iOS 11+ 上受支持。
  • @arash 看,像UIButtonUIBarButtonItem 这样的元素的文本颜色取决于属性tintColor,因为您可以设置全局色调,所有“突出显示”的元素都将具有这种颜色。我认为这不是更改所有标签颜色的好方法,因为标签可以在各种情况下使用。然后,我认为使用 Color Set 很好
  • 现在你改变了问题。正如他所说的“在整个应用程序中一次更改我的 UILabel 的文本颜色属性”,他想一次更改所有 UILabels 的文本颜色。
  • @arash 这正是我的解决方案所做的。您只需要指定哪些标签,这对我来说似乎更好,因为我在上面的评论中写了原因。
【解决方案2】:

AppDelegate.swift 内的 didFinishLaunchingWithOptions 函数中试试这个:

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

【讨论】:

  • 非常好的通用解决方案。想知道这是否可以设置为在本地被覆盖,否则它可能太极端了。
  • 只是对我之前评论的跟进(如果有人阅读并分享我的想法),我也发布了一个答案,它的工作原理几乎相同,同时允许保留自定义颜色。
【解决方案3】:

我真的很喜欢Arash Etemad's solution,但发现它非常极端,因为它超越了所有颜色,即使其中一些是定制的。在处理现有的大型项目时,这并不是很好。

所以我想出了这个(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
        }
    }    
}

它使用标签自己的生命周期事件来覆盖默认的系统字体颜色。随着 iOS 13 中暗模式的出现,可以识别为UIColor.label,而之前是UIColor.darkText

这可以防止自定义字体颜色被覆盖(除非您的自定义颜色与默认颜色相同 ?!? ),同时不需要在整个项目中手动设置字体颜色。

【讨论】:

  • 为什么你觉得我的解决方案极端?你为UILabel设置默认颜色,然后你可以有一些不同颜色的自定义标签!
  • 我从事一个由许多人多年来开发的项目。此项目中的一些标签默认为系统颜色,其他标签是自定义的。您在 AppDelegate didFinishLaunching 中应用的解决方案导致所有内容都更改为该颜色,即使 95% 已经设置了自定义颜色。我想可以更新颜色设置的方式,使其工作,但是你会转换 95% 的代码库,用于损坏的 5%。但我肯定更喜欢你在一个新项目上的解决方案,那里没有太多的遗留问题,而且当它可以从一开始就遵循时,这是一个很好的模式。
【解决方案4】:

创建一个 UILabel 类并将该类中的 textColour 设置为您想要的颜色。并将此类用于您在应用程序中使用的所有标签。如果您想在会话期间更改所有标签的颜色,例如通过按钮操作,您可以使用 NotificationCenter 和 Singleton。

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)
    }
}

【讨论】:

  • 可能值得拥有一个控制颜色的类级别属性?
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 2014-12-12
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多